在pthread启动函数中返回()与pthread_exit()

下面的程序显示我们可以使用return()或pthread_exit()来返回一个可用于pthread_join()的状态variables的void *variables。

(1)是否应该优先使用另一种?

(2)为什么使用return()工作? 通常情况下,我们会考虑将返回值放在堆栈上,但是由于线程已经完成,堆栈应该会消失。 还是堆栈不会被破坏,直到pthread_join()之后?

(3)在你的工作中,你看到很多状态variables的用法吗? 看来90%的代码我只看到状态参数NULL。 由于任何通过void * ptr改变的东西已经在调用线程中反映出来,所以看起来没什么意思。 任何返回的新的void * ptr都必须指向启动线程的malloc-ed,这使得接收线程有责任处理它。 我错在认为状态variables是半无意义的吗?

#include <iostream> #include <pthread.h> using namespace std; struct taskdata { int x; float y; string z; }; void* task1(void *data) { taskdata *t = (taskdata *) data; t->x += 25; t->y -= 4.5; t->z = "Goodbye"; return(data); } void* task2(void *data) { taskdata *t = (taskdata *) data; t->x -= 25; t->y += 4.5; t->z = "World"; pthread_exit(data); } int main(int argc, char *argv[]) { pthread_t threadID; taskdata t = {10, 10.0, "Hello"}; void *status; cout << "before " << tx << " " << ty << " " << tz << endl; //by return() pthread_create(&threadID, NULL, task1, (void *) &t); pthread_join(threadID, &status); taskdata *ts = (taskdata *) status; cout << "after task1 " << ts->x << " " << ts->y << " " << ts->z << endl; //by pthread_exit() pthread_create(&threadID, NULL, task2, (void *) &t); pthread_join(threadID, &status); ts = (taskdata *) status; cout << "after task2 " << ts->x << " " << ts->y << " " << ts->z << endl; } 

输出:

 before 10 10 Hello after task1 35 5.5 Goodbye after task2 10 10 World 

Solutions Collecting From Web of "在pthread启动函数中返回()与pthread_exit()"

(1)在C ++代码中,使用return会导致堆栈解开并且局部变量被销毁,而pthread_exit只保证调用注册到pthread_cancel_push()取消处理程序。 在一些系统上,这个机制也会导致C ++局部变量的析构函数被调用,但是这并不能保证可移植的代码—检查你的平台文档。

而且,在main()return会隐式地调用exit() ,从而终止程序,而pthread_exit()只会终止线程,程序将一直运行,直到所有的线程终止或某个线程调用exit() abort()或另一个终止程序的函数。

(2)由于POSIX规范的说明, return工作的使用。 返回的值存储在pthread_join()可以检索它的地方。 在调用pthread_join()之前,线程使用的资源不会被回收。

(3)我从来没有在原始的POSIX线程中使用线程的返回值。 不过,我倾向于使用更高级别的工具,比如Boost线程库,以及最近的C ++ 0x线程库,它们提供了在线程之间传递值的替代方法,例如期货,这样可以避免与内存管理相关的问题暗指。

我认为从start_routine return是可取的,因为它确保调用堆栈正确解开。

对于C而言,这比C ++更重要,因为它没有在初步退出之后清除混乱的破坏者魔法。 所以你的代码应该通过调用堆栈上的例程的所有最后部分来做free和类似的事情。

为什么这个工作,这很简单

如果start_routine返回,则效果应该如同使用start_routine的返回值作为退出状态隐式调用pthread_exit()

对于我个人的经验,我倾向于不使用终止线程的状态很多。 这就是为什么我经常有线程开始detached 。 但这应该很大程度上取决于应用程序,当然不是一般化的。