在 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);
}