C++:将结构体传递给PThread

3

我试图通过使用结构体将多个值传递给线程。

这是我的代码:

int main()
{

struct Data
{
int test_data;
int test_again;
};

Data data_struct;
data_struct.test_data = 0;
data_struct.test_again = 1;

pthread_create(&thread, NULL, Process_Data, (void *)&data_struct);
return 0;
}


void* Process_Data(void *data_struct)
{
 struct test
{
    int test_variable;
    int test_two;
};
test testing;
testing.test_variable = *((int *)data_struct.test_data);
testing.test_two = *((int *)data_struct.test_again);
}

为了简单起见,我已经省略了任何代码(包括#include和线程连接等),但如果需要更多的代码,请随时提出。

当传递一个整数变量时,线程正常工作。

这是我收到的错误:

在函数“void * Process_Data(void *)”中:错误:请求对非类类型“void *”的“data_struct”中的成员“test_variable”的成员“test_variable”的测试。testing.test_variable = *((int *)data_test.test_variable);

另一个变量也是如此

感谢您提前提供任何建议。


那么,连接操作确实有所作用。如果没有它们,什么能让结构体保持存在呢? - David Heffernan
std::thread 不是你的选择吗? - Fred Larson
2个回答

4
通常的方法是:
void* Process_Data(void *data_struct)
{
  Data *testing = static_cast<Data*>(data_struct);

  // testing->test_data and testing->test_again are
  // data_struct.test_data and data_struct.test_again from main
}

你收到此错误是因为你试图从一个 void 指针中提取成员,但该指针没有任何成员。为了使用你知道的 void 指针所指向的结构体,你需要将其强制转换回指向该结构体的指针。
另外,请注意你应该 pthread_join 刚刚启动的线程,否则主函数将在执行任何操作之前结束。

谢谢@Wintermute,现在的问题是Data在线程的范围内未声明,我是否应该以某种方式传递实际结构而不是其实例(即传递Data而不是data_struct)? - user3001499
结构体本身不是一个对象(它是一种对象类型),因此您无法将其传递给函数。我会在main之外声明结构体,以便两个函数都知道它。如果函数位于不同的翻译单元中,则可以在头文件中声明。 - Wintermute

1

您有一个未经类型化的void*指针,您正在尝试从中提取数据

首先尝试将指针转换为某种类型,然后再使用它

Data* p = (Data*)data_struct;

int a = p->test_data;
int b = p->test_again;

C风格的强制类型转换不好,嗯。 - Captain Obvlious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接