pthread cancel為何無法取消掉乙個執行緒

2021-09-01 06:28:08 字數 2374 閱讀 6829

pthread_cancel如何取消執行緒

首先了解pthread_cancel取消執行緒的機制

執行緒可以通過呼叫pthread_cancel函式來取消同一程序中的其他執行緒

pthread_cancel函式
#include int pthread_cancel(pthread_t tid);

成功取消返回0 不成功返回非0

pthread_cancel 函式的作用會像呼叫引數為pthread_canceled的pthread_exit函式一樣,使執行緒終止。

但是,pthread_cancel 並不等待執行緒終止它僅僅是個請求。

執行緒再收到pthread_cancel 的取消請求後,可能會忽略,立即取消或者執行至取消點取消。系統預設情況下,收到取消請求後,執行緒會繼續執行到,下乙個取消點處終止程序。

取消點:取消點是執行緒檢查它是否被取消的乙個點,posix保證再一些函式取消點一定會出現如 sleep accept write read等

乙個死迴圈的執行緒,沒有取消點(一些函式會自帶取消點,所以為了死迴圈,不在其中新增任何函式),無法被取消。

[wens@localhost pthread_cancel]$ cat test.cpp 

#include #include #include using namespace std;

void* thread(void* arg)

}int main()

執行該函式,將會是乙個持續的死迴圈,pthread_cancel該函式已經執行過,取消請求也已傳送,但執行緒並不會終止。

之前已經說過,預設情況是,收到取消請求後,執行緒將會執行到函式內部的取消點後終止函式即系統預設的可取消狀態是pthread_cancel_enable,當執行緒的可取消狀態是pthread_cancel_disable時,執行緒收到取消請求在取消點也不會取消,直到可取消狀態變更為pthread_cancel_enable時,執行緒將會在下乙個取消點取消。所以說,除了執行緒是否取消,與取消點有關外,還會和取消狀態有關。

可取消狀態 分為 pthread_cancel_enable pthread_cancel_disable

可通過乙個函式來修改執行緒的取消狀態

pthread_setcancelstate(int state ,int *oldstate);

state:設定新狀態

oldstate:存放原先的取消狀態

在保證取消狀態的前提下,我們還需要乙個取消點

所以在死迴圈中我們需要乙個取消點,在posix的標準中提供了一寫函式自帶取消點,如之前說過的sleep write read wait 等一系列函式。

除了這些pthread 庫還提供了乙個乙個函式可以設定乙個取消點

int pthread_testcancel(void);

成功返回0 失敗返回乙個錯誤碼

該函式會在函式內部設定乙個取消點,呼叫該函式時,如果收到乙個取消請求,且取消狀態是可取消的,就會立即將執行緒取消。如果取消狀態為不可取消,且沒有取消請求,就不會取消,直到兩者條件都滿足時。

我們可以在while迴圈中直接掉用pthread_testcancel() 或者sleep() 或者用cout輸出(底層呼叫write),此時都可以將執行緒取消。

而在此時還有一種取型別為非同步取消,即為當呼叫pthread_cancel後,執行緒就會立即取消調,而不用等到執行到取消點時再取消執行緒,取消型別同取消狀態一樣可以修改。

pthread_setcanceltype(int type,int* oldtype);

//引數意義與設定狀態的意義相同

可選型別:pthread_cancel_deferred :執行緒接收到取消操作後,直到執行到「可取消點」後取消。

pthread_cancel_asynchronous :執行緒接收到取消操作後,立即取消。

在while中使用pthread_setcanceltype設定,在可取消狀態下,當有取消請求時,執行緒就可立即取消。

「可取消性」和「可取消型別」存在於任意乙個新建執行緒中,包括主線程,預設設定是pthread_cancel_enable 和 pthread_cancel_deferred。

在說一下個人關於取消點的理解,posix提供的一系列自帶取消點的函式,經過分析可以發現大部分函式都有一些共同的特點,就是阻塞式的系統呼叫或花費時間較大的io操作,而這些操作勢必會陷入核心態,而我們知道系統在從核心態切回使用者態時會進行乙個訊號的檢查,如果收到訊號就會處理訊號,而取消訊號應該就是在此時被處理,從而取消掉執行緒。

執行緒取消 pthread cancel

基本概念 pthread cancel呼叫並不等待執行緒終止,它只提出請求。執行緒在取消請求 pthread cancel 發出後會繼續執行,直到到達某個取消點 cancellationpoint 取消點是執行緒檢查是否被取消並按照請求進行動作的乙個位置.與執行緒取消相關的pthread函式 int...

執行緒pthread cancel 函式

功能 呼叫執行緒終止同程序中,其他的執行緒,呼叫該方法後,被終止的執行緒並不一定立馬被終止,只有在下次系統呼叫或呼叫了pthread testcancel 方法後,才真正終止執行緒 原型 int pthread cancel pthread t pid include includevoid chi...

pthread cancel 使用方法1

include include define failure 0 define success 1 define uns32 unsigned int define m error format,args.printf format,args fflush stdout static pthread...