以下程序顯示我們可以使用return()或pthread_exit()返回可用於pthread_join()狀態變量的void *變量。pthread啓動函數中的return()與pthread_exit()
(1)是否應該優先使用另一種?
(2)爲什麼使用return()工作?通常情況下,我們會考慮將返回值放在堆棧上,但由於線程完成,堆棧應該消失。或者在pthread_join()之後堆棧不會被銷燬?
(3)在你的工作中,你看到很多狀態變量的用法嗎?看來90%的代碼我只看到NULL狀態參數。由於任何通過void * ptr改變的東西已經在調用線程中反映出來,所以返回它似乎沒有多大意義。任何返回的新void * ptr都必須指向啓動線程malloc-ed,這使接收線程有責任處理它。我認爲狀態變量是半無意義的嗎?
#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 " << t.x << " " << t.y << " " << t.z << 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
關於(1),pthread_exit不會立即終止線程,它首先運行取消處理程序。至少NPTL/g ++對取消處理程序和C++ dtors使用相同的機制,所以在這種情況下,pthread_exit確實可以展開堆棧。同樣,OpenVMS pthread_exit /線程取消展開堆棧並運行C++ dtors。您應該查看您的特定pthread實現的手冊,以瞭解pthread_exit和堆棧展開的行爲。 – 2010-09-11 21:05:58
我已說明(1)將您的意見納入考慮範圍。 – 2010-09-11 21:33:15
我絕對買你的書:)(希望它很快出來)。 – celavek 2011-03-22 08:23:21