1. 程式人生 > >c語言如何釋放一個被阻塞住的執行緒

c語言如何釋放一個被阻塞住的執行緒

問:在c語言中,使用pthread_create建立執行緒。線上程中阻塞函式導致其阻塞的時候,如何退出執行緒?

答:

執行緒退出方式:

(1)正常順序執行完後return;

(2)線上程內部自身呼叫pthread_exit();

這兩種方式都依賴於執行緒函式自身執行,如果執行緒遇到阻塞函式被阻塞,則不能繼續執行,則無法滿足上述條件。

(3)使用pthread_cancel()函式:

該函式在cancle point處能退出執行緒。並且能夠使阻塞的執行緒跳出阻塞,因此按照如下方式能夠退出執行緒:

pthread_testcancel();

block_function();//該函式為會引起阻塞的函式,並且滿足POSIX指定的可以被pthread_cancle發出的cancel訊號打破阻塞態的函式,具體可以參照網上

pthread_testcancel();

備註(該備註內容摘抄自網際網路:https://blog.csdn.net/slj_win/article/details/7267379):根據POSIX標準,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函式以及read()、write()等會引起阻塞的系統呼叫都是Cancelation-point,而其他pthread函式都不會引起Cancelation動作。但是pthread_cancel的手冊頁聲稱,由於LinuxThread庫與C庫結合得不好,因而目前C庫函式都不是Cancelation-point;但CANCEL訊號會使執行緒從阻塞的系統呼叫中退出,並置EINTR錯誤碼,因此可以在需要作為Cancelation-point的系統呼叫前後呼叫pthread_testcancel(),從而達到POSIX標準所要求的目標。