nginx Firefox apache Ubuntu 编程 wordpress java shell linux Windows 开源 php mysql centos google 微软 程序员 云计算 Android Python

线程取消有哪些需要注意的

  pthread_cancel調用並不等待線程終止,它只提出請求。線程在取消請求(pthread_cancel)發出後會繼續運行,
  直到到達某個取消點(CancellationPoint)。取消點是線程檢查是否被取消並按照請求進行動作的一個位置.
  與線程取消相關的pthread函數
  int pthread_cancel(pthread_t thread)
  發送終止信號給thread線程,如果成功則返回0,否則為非0值。發送成功並不意味著thread會終止。

  int pthread_setcancelstate(int state,   int *oldstate)   
  設置本線程對cancel信號的反應,state有兩種值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,
分別表示收到信號後設為CANCLED狀態和忽略CANCEL信號繼續運行;old_state如果不為NULL則存入原來的Cancel狀態以便恢復。  

  int pthread_setcanceltype(int type, int *oldtype)   
  設置本線程取消動作的執行時機,type由兩種取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,僅當Cancel狀態為enable時有效,分別表示收到信號後繼續運行至下一個取消點再退出和立即執行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。  

  void pthread_testcancel(void)
  是說pthread_testcancel在不包含取消點,但是又需要取消點的地方創建一個取消點,以便在一個沒有包含取消點的執行代碼線程中響應取消請求.
線程取消功能處於啟用狀態且取消狀態設置為延遲狀態時,pthread_testcancel()函數有效。
如果在取消功能處處於禁用狀態下調用pthread_testcancel(),則該函數不起作用。
請務必僅在線程取消線程操作安全的序列中插入pthread_testcancel()。除通過pthread_testcancel()調用以編程方式建立的取消點意外,pthread標準還指定了幾個取消點。測試退出點,就是測試cancel信號.
 線程取消的方法是向目標線程發Cancel信號,但如何處理Cancel信號則由目標線程自己決定,或者忽略、或者立即終止、或者繼續運行至Cancelation-point(取消點),由不同的Cancelation狀態決定。

 線程接收到CANCEL信號的缺省處理(即pthread_create()創建線程的缺省狀態)是繼續運行至取消點,也就是說設置一個CANCELED狀態,線程繼續運行,只有運行至Cancelation-point的時候才會退出。

 pthreads標準指定了幾個取消點,其中包括:
(1)通過pthread_testcancel調用以編程方式建立線程取消點。 
(2)線程等待pthread_cond_wait或pthread_cond_timewait()中的特定條件。 
(3)被sigwait(2)阻塞的函數 
(4)一些標準的庫調用。通常,這些調用包括線程可基於阻塞的函數。  
 缺省情況下,將啟用取消功能。有時,您可能希望應用程序禁用取消功能。如果禁用取消功能,則會導致延遲所有的取消請求

延伸阅读

评论