【问题标题】:Dereferencing struct pointer in pthread在 pthread 中取消引用结构指针
【发布时间】: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::threadstd::async
  • 显示的代码使您看起来像是在使用 C 示例或教程,而您似乎想要编写 C++ 代码。如果您正在尝试学习 C++,请确保使用 C++ 学习材料而不是 C 学习材料。这些语言有一些相似之处,但它们非常不同。请务必使用 2011 年之后制作的材料,从那时起语言发生了很大变化。
  • struct 是在 main 中本地定义的,因此您不能从像 deal_cards 这样的其他函数中引用它。您将无法将指针转换回正确的类型。
  • (struct t_data*) 是一个演员,但它是什么演员?另请注意,data 参数未在函数中的任何位置使用。
  • 一旦你修复了第一个位,(std::vector&lt;int&gt;*) 演员就不需要了。

标签: c++ pointers pthreads


【解决方案1】:

您的代码中有很多错误:

  • t_data 结构类型是在main() 本地定义的,所以deal_cards() 不能使用它。

  • main() 正在退出,销毁其局部变量,而线程仍在运行。

  • 您试图在deal_cards() 中访问push_back() 的语法完全错误。您根本没有引用data 输入参数,这就是您应该将类​​型转换为t_data* 的内容。而且,您正在将ptr_deck 类型转换为std::vector&lt;int&gt;*,它已经被键入,因此不需要强制转换。而且,由于ptr_deck是一个指针,你需要使用-&gt;操作符来访问它的push_back()方法,而不是.操作符。

此外,虽然不是严格意义上的错误,但您还应该注意以下几点:

  • 您正在使用 std::string 而不使用 #include &lt;string&gt;

  • 与 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 类而不是直接使用 pthread:

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

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 2013-01-04
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2017-06-17
    • 2016-05-12
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多