本文可任意轉載,但必須註明作者和出處。
【原創】手把手教你Linux下的多線程設計(一)
--Linux下多線程編程詳解
原創作者:Frozen_socker(冰棍)
E_mail:dlskyfly@163.com
接下來,再看另兩個重要的函數pthread_exit和pthread_join
函數原型如下:
void pthread_exit( void * value_ptr );
線程的終止可以是調用了pthread_exit或者該線程的常式結束。也就是說,一個線程可以隱式的退出,也可以顯式的調用pthread_exit函數來退出。
pthread_exit函數唯一的參數value_ptr是函數的傳回碼,只要pthread_join中的第二個參數value_ptr不是NULL,這個值將被傳遞給value_ptr。
函數原型如下:
int pthread_join( pthread_t thread, void * * value_ptr );
函數pthread_join的作用是,等待一個線程終止。
調用pthread_join的線程將被掛起直到參數thread所代表的線程終止時為止。pthread_join是一個線程阻塞函數,調用它的函數將一直等到被等待的線程結束為止。
如果value_ptr不為NULL,那麼線程thread的傳回值儲存在該指標指向的位置。該傳回值可以是由pthread_exit給出的值,或者該線程被取消而返回PTHREAD_CANCELED。
當一個非分離的線程終止後,該線程的記憶體資源(線程描述符和棧)並不會被釋放,直到有線程對它使用了pthread_join時才被釋放。因此,必須對每個建立為非分離的線程調用一次pthread_join調用,以避免記憶體流失。否則當線程是可分離的,調用pthread_exit,將終止該調用線程,並釋放所有資源,沒有線程等待它終止。
至多隻能有一個線程等待給定的線程終止。如果已經有一個線程在等待thread線程終止了,那麼再次調用pthread_join等待同一線程的線程將返回一個錯誤。
//example_2.c
#include <stdio.h>
#include <pthread.h>
void * pthread_func_test(void * arg);
int main()
...{
pthread_t pt1,pt2;
pthread_create(&pt1,NULL,pthread_func_test,"This is the Thread_ONE");
pthread_create(&pt2,NULL,pthread_func_test,"This is the Thread_TWO");
pthread_join(pt1,NULL);
pthread_join(pt2,NULL); //這行不寫,會發生什嗎?或寫成pthread_join(pt1,NULL);又會怎麼樣?
}
void * pthread_func_test(void * arg)
...{
printf("%s ",arg);
pthread_exit(NULL); //顯式聲明
}
到此為止,我們就學習了三個重要的函數--create、exit、join,下一篇,繼續講解多線程編程中的線程互斥問題。