我需要将一个结构传递给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_deck
到std::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);
}