在 pthread 中取消引用结构指针
Dereferencing struct pointer in 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()
正在退出,销毁其局部变量,而线程仍在 运行.
您试图在 deal_cards()
中访问 push_back()
的语法完全错误。您根本没有引用 data
输入参数,您应该将其类型转换为 t_data*
。而且,您正在将 ptr_deck
类型转换为 std::vector<int>*
,它已经被输入为,因此不需要转换。而且,由于 ptr_deck
是一个指针,您需要使用 ->
运算符来访问它的 push_back()
方法,而不是 .
运算符。
此外,虽然不是严格意义上的错误,但您还应该注意以下几点:
您正在使用 std::string
而没有 #include <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
class 而不是直接使用 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);
}
我需要将结构传递给 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()
正在退出,销毁其局部变量,而线程仍在 运行.您试图在
deal_cards()
中访问push_back()
的语法完全错误。您根本没有引用data
输入参数,您应该将其类型转换为t_data*
。而且,您正在将ptr_deck
类型转换为std::vector<int>*
,它已经被输入为,因此不需要转换。而且,由于ptr_deck
是一个指针,您需要使用->
运算符来访问它的push_back()
方法,而不是.
运算符。
此外,虽然不是严格意义上的错误,但您还应该注意以下几点:
您正在使用
std::string
而没有#include <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
class 而不是直接使用 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);
}