http://www.360doc.com/content/13/0106/09/9171956_258497083.shtml
pthread_t pthr;
pthread_create(&pthr, NULL, thread_handler, NULL);
...
void* thread_handler(void* arg)
{
/* do something */
pthread_join(pthr, NULL);
}
上面的代碼不好使,pthread_join不能放在pthread調用的handler內,雖然不報錯,但是thread無法正常回收,如果多次創建thread,內存會越來越大(另一種形式的內存泄露)。
正確的做法是在handler外面pthread_join:
pthread_t pthr;
pthread_create(&pthr, NULL, thread_handler, NULL);
pthread_join(pthr, NULL);
...
void* thread_handler(void* arg)
{
/* do something */
}
如果不用pthread_join,改用pthread_detach呢?那最方便,但要注意:pthread_detach最好是放在handler里面第一句。
void* thread_handler(void* arg)
{
pthread_detach(pthr);
/* do something */
}
如果pthread_create后緊跟pthread_detach,有可能會出錯。
linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,
如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所占用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之后這些資源才會被釋放。
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
頭文件
#include <pthread.h>
函數原型
pthread_t pthread_self(void);
功能
獲取當前調用線程的 thread identifier(標識號).
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_detach(pthread_self());
通常是主線程使用pthread_create()創建子線程以后,一般可以調用pthread_detach(threadid)分離剛剛創建的子線程,這里的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;
被創建的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函數返回的就是自己本身的線程ID。