对pthreads感到困惑

时间:2014-02-07 17:52:56

标签: c++ c pthreads posix

首先,我是pthreads的新手,所以如果我完全误解了,请告诉我。

我搜索了返回值的正确方法,但遇到了此链接How to return a value from thread in Chttps://linuxprograms.wordpress.com/category/pipes/

所以我可以共享由起始线程或管道信息控制的位置,但最后一个值不能放在某个堆栈上?为什么returnshell(例如bash)调用时程序的行为方式不同?

(根据我的理解,如果它是C ++,可能会有一个常规的返回值,但是(根据我读到的内容,我想在这里也许https://computing.llnl.gov/tutorials/pthreads/)POSIX没有完全为C ++定义,只是C。)

2 个答案:

答案 0 :(得分:2)

看一下pthread_exit和pthread_join。

完成帖子后,您可以拨打pthread_exit(void* retval)

  

pthread_exit()函数终止调用线程并返回   通过retval的值(如果是          thread is joinable)可用于调用pthread_join(3)的同一进程中的另一个线程。

对pthread_exit的这个调用将停止你的线程,正如它所说的那样,将返回值存储在pthread_join可以获取的位置,并将其放在第二个参数中:int pthread_join(pthread_t thread, void **retval);

当您调用pthread_join(tid, &returnVal);,其中tid是pthread_t时,returnVal现在将保存指向返回给pthread_exit

的值的指针

这允许您在退出时从线程传递数据。

答案 1 :(得分:1)

每个线程都有自己的堆栈和父进程的本地环境。您的主进程创建一个线程(主线程),您的代码在其下运行。您创建的任何其他线程都获得相同的处理:每个线程都获得一个堆栈,一个线程上下文,一个线程本地存储(如果适用),并且没有公共堆栈来返回值。

当你加入一个你开始的线程时,会发生什么,你实际上正在等待它完成执行。这将取消阻止等待,但不会返回任何用户值,因为通常会破坏该进程中的线程,其堆栈及其所有环境。 在线程运行时,它们可以按照您提到的方式相互通信,只要您使用同步机制序列化这些访问,它们也可以读/写公共内存位置。

如果你的线程必须有一个返回值,那么你可能想把它封装在一个类中,在开始时将它传递给类实例,然后就在线程退出之前,它可以在一个类中留下一个“返回值”。这个类的成员,所以你可以在类“run”或“start”方法(实际运行该线程的方法)之后检查它。

希望这有帮助。