【发布时间】:2021-11-23 09:37:53
【问题描述】:
我需要将结构传递给 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
我遗漏了什么,这是改变结构内值的正确方法吗?
【问题讨论】:
-
C++ 自 C++11 起将线程功能作为标准库的一部分提供。它们比 pthread 更易于使用且类型更安全,因此应该使用它们。见
std::thread和std::async。 -
显示的代码使您看起来像是在使用 C 示例或教程,而您似乎想要编写 C++ 代码。如果您正在尝试学习 C++,请确保使用 C++ 学习材料而不是 C 学习材料。这些语言有一些相似之处,但它们非常不同。请务必使用 2011 年之后制作的材料,从那时起语言发生了很大变化。
-
struct是在main中本地定义的,因此您不能从像deal_cards这样的其他函数中引用它。您将无法将指针转换回正确的类型。 -
(struct t_data*)是一个演员,但它是什么演员?另请注意,data参数未在函数中的任何位置使用。 -
一旦你修复了第一个位,
(std::vector<int>*)演员就不需要了。