我需要將結構傳遞給 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
我錯過了什么,這是改變結構內值的正確方法嗎?
uj5u.com熱心網友回復:
您的代碼中有很多錯誤:
該
t_data結構型別被定義本地的main(),所以deal_cards()不能使用它。main()正在退出,銷毀其區域變數,而執行緒仍在運行。你要使用訪問的語法
push_back()中deal_cards()是完全錯誤的。您根本沒有參考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類而不是 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315021.html
上一篇:為什么陣列在沒有指標的情況下不列印?下面的代碼正確嗎?
下一篇:在C中初始化字符陣列的不同型別
