1. 程式人生 > >執行緒的退出

執行緒的退出

虛擬碼描述如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void* subThread(void*)

{

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldCancleState);

  …;//不存在獲取臨界資源操作,可以安全退出的程式碼塊

  pthread_testcancel();//如果可以安全退出的程式碼塊不存在取消點操作,可以自己新增pthread_testcancel呼叫,執行緒執行到這個呼叫就會退出

  /*還有一種方法,在可以安全退出的程式碼塊,我們將執行緒的可取消型別設定成PTHREAD_CANCEL_ ASYNCHRONOUS,這樣即使沒有取消點也可以馬上退出*/

 

  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldCancleState);

  /*存在獲取-釋放臨界資源操作,如果在lock和unlock之間的執行收到cancel訊號,且可取消狀態為enable,則鎖永遠無法被釋放*/

  Lock();

  …;

  

Unlock();

}

 

void* mainThread(void*)

{

  pthread_cancel(subThread);//給subThread傳送退出訊號

  pthread_join(subThread,null);//進入休眠,直到subThread退出成功

}

無論使用哪種方式,核心點就是要保證執行緒退出的時候不會獲取了某些臨界資源而無法釋放

POSIX.1定義的取消點見下:

注意:當主執行緒呼叫pthread_cancel介面後,只是將取消請求傳送給指定執行緒,