1.相關函數介紹 a.
int pthread_cancel(pthread_t thread)發送終止信號給thread線程,如果成功則返回0,否則為非0值。發送成功并不意味著thread會終止。
b.
int pthread_setcancelstate(int state, int *oldstate)設置本線程對Cancel信號的反應,state有兩種值:PTHREAD_CANCEL_ENABLE(缺?。┖蚉THREAD_CANCEL_DISABLE, 分別表示收到信號后設為CANCLED狀態和忽略CANCEL信號繼續運行;old_state如果不為NULL則存入原來的Cancel狀態以便恢復。
c.
int pthread_setcanceltype(int type, int *oldtype)設置本線程取消動作的執行時機,type由兩種取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,僅當Cancel狀態為Enable時有效,分別表示收到信號后繼續運行至下一個取消點再退出和立即執行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。
d.
void pthread_testcancel(void)是說pthread_testcancel在不包含取消點,但是又需要取消點的地方創建一個取消點,以便在一個沒有包含取消點的執行代碼線程中響應取消請求. 線程取消功能處于啟用狀態且取消狀態設置為延遲狀態時,pthread_testcancel()函數有效。 如果在取消功能處處于禁用狀態下調用pthread_testcancel(),則該函數不起作用。 請務必僅在線程取消線程操作安全的序列中插入pthread_testcancel()。除通過pthread_testcancel()調用以編程方式建立的取消點意外,pthread標準還指定了幾個取消點。測試退出點,就是測試cancel信號.
e.
int pthread_join(pthread_t thread, void **value_ptr);thread:等待退出線程的線程號。 value_ptr:退出線程的返回值。
1.同步取消線程 代碼示例:
#include<stdio.h> #include<stdlib.h> #include <pthread.h> void *thread_fun(void *arg) { int i=1; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); /*同步取消,等到下一個取消點再取消*/ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); 2.異步取消線程 示例代碼: #include<stdio.h> #include<stdlib.h> #include <pthread.h> void *thread_fun(void *arg) { int i=1; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); /*同步取消,等到下一個取消點再取消*/// pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); /*異步取消, 線程接到取消信號后,立即退出*/ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); printf("thread start /n"); while(1) { i++; } return (void *)0; } int main() { void *ret=NULL; int iret=0; pthread_t tid; pthread_create(&tid,NULL,thread_fun,NULL); sleep(1); pthread_cancel(tid);//取消線程 pthread_join(tid, &ret); printf("thread 3 exit code %d/n", (int)ret); return 0; }代碼編譯:
gcc pthread_test.c -o pthread_test -lpthread新聞熱點
疑難解答