【发布时间】:2020-12-07 07:39:39
【问题描述】:
我刚开始使用 pthreads 学习 C++ 中的多线程。我正在使用以下代码:
struct ArgT{
int a;
int b;
ArgT(int a, int b)
: a(a), b(b)
{}
ArgT()
:a(0), b(0)
{}
};
void* worker(void* arg)
{
ArgT* myArg = (ArgT*) arg;
int* result = new int;
*result = myArg->a + myArg->b;
std::cout << "(void*)result: " << (void*) result << std::endl;
return (void*)result;
}
int main()
{
ArgT mainArg(2,3);
pthread_t p;
int* main_result;
pthread_create(&p, NULL, worker, (void*)&mainArg);
pthread_join(p, (void**)&main_result); //??
std::cout << "main_result: " << main_result << std::endl;
std::cout << "&main_result: "<< &main_result << std::endl;
printf("\nResult = %d\n", *main_result);
delete main_result;
return 0;
}
代码输出如下
(void*)result: 0x7f07ac0008c0
main_result: 0x7f07ac0008c0
&main_result: 0x7fffb1aa0588
Result = 5
我的问题是pthread_join() 接受void** 作为第二个参数,它基本上是地址的地址。而我们在worker() 函数中返回void* 类型的地址。这两种类型如何兼容?
【问题讨论】:
-
因为您正在编写 C++,所以我真的建议您查看
std::thread。或者,如果您期望返回std::async. -
至于
void**问题,它是一种在C 中模拟通过引用传递的方法(POSIX 线程API 是C API)。 -
感谢您的意见。那是我的下一个问题,使用 std::thread 而不是 pthreads 的主要优势是什么。我主要坚持使用 pthreads,因为我目前正在阅读的书(操作系统:三个简单的部分)用 pthread @Someprogrammerdude 解释了一切
-
除了它是标准 C++ 库的一部分,因此是可移植的吗?好吧,这通常要容易得多。你可以只拥有
void worker(ArgT argument) { ... },然后创建一个像std::thread my_thread(&worker, mainArg); /* Other code... */ my_thread.join();这样的线程,不再需要强制转换、类型安全、面向对象、更简单...... ;) -
我明白了。我想我会坚持使用 pthreads,直到我完成这本书,也许稍后我可以切换到
std::threads。我主要想学习有关多线程的理论。我认为一旦我对理论相当有能力,我就可以切换 API。感谢您的输入。 @Someprogrammerdude
标签: c++ multithreading pthreads pthread-join