正在pthread中取消引用结构指针



我需要将一个结构传递给pthread,并能够从pthread将执行的函数中更改结构的值。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <pthread.h>
void *deal_cards(void* deck);
int main() {
struct t_data {
std::string name;
std::string status;
std::vector<int> hand;
std::vector<int> *ptr_deck;
};
std::vector<int> deck = {1,2,3};
std::vector<int> *p_deck = &deck;
struct t_data player1_data = {"PLAYER 1", "lose", {}, p_deck};
struct t_data *player1 = &player1_data;
pthread_t p1;
pthread_create (&p1, NULL, deal_cards, (void *) player1);
}
void* deal_cards (void* data) {
(struct t_data*)->(std::vector<int>*)ptr_deck.push_back(3);
}

当我运行这个时,我得到了以下错误

In function 'void* deal_cards (void*)
error: expected primary-expression before 'struct'
error: expected ')' before 'struct'

如果重要的话,我正在使用在Linux上编译

g++ main.cpp -o main -lpthreads

我缺少什么?这是改变结构内部价值观的正确方式吗?

您的代码中有许多错误:

  • t_data结构类型是在main()的本地定义的,因此deal_cards()不能使用它。

  • main()正在退出,破坏其局部变量,而线程仍在运行。

  • 您试图在CCD_ 6中访问CCD_ 5的语法都是错误的。您根本没有引用data输入参数,这就是您应该键入的t_data*类型转换。并且,您正在将类型转换为ptr_deckstd::vector<int>*,它已经被类型化为,因此不需要转换。而且,由于ptr_deck是一个指针,因此需要使用->运算符来访问其push_back()方法,而不是.运算符。

此外,虽然不是严格意义上的错误,但您也应该注意这些:

  • 您使用的是不带#include <string>std::string

  • 与C不同,在C++中,您不需要在引用结构类型之前加上struct关键字。只有结构类型的声明才需要使用struct关键字。

话虽如此,还是试试这个:

#include <vector>
#include <string>
#include <pthread.h>
void* deal_cards(void* deck);
struct t_data {
std::string name;
std::string status;
std::vector<int> hand;
std::vector<int> *ptr_deck;
};
int main() {
std::vector<int> deck = {1,2,3};
t_data player1_data = {"PLAYER 1", "lose", {}, &deck};
pthread_t p1;
if (pthread_create (&p1, NULL, deal_cards, &player1_data) == 0) {
pthread_join (p1, NULL);
// use deck as needed...
}
}
void* deal_cards (void* data) {
static_cast<t_data*>(data)->ptr_deck->push_back(3);
return NULL;
}

不过,您确实应该使用C++自己的std::thread类,而不是直接使用pthreads:

#include <vector>
#include <string>
#include <thread>
struct t_data {
std::string name;
std::string status;
std::vector<int> hand;
std::vector<int> *ptr_deck;
};
void deal_cards(t_data* deck);
int main() {
std::vector<int> deck = {1,2,3};
t_data player1_data = {"PLAYER 1", "lose", {}, &deck};
std::thread p1(deal_cards, &player1_data);
p1.join();
// use deck as needed...
}
void deal_cards (t_data* data) {
data->ptr_deck->push_back(3);
}

最新更新