linux下pthread_cancel無法取消線程的原因【轉】
阿新 • • 發佈:2017-12-13
null alt 使用 comm urn stdio.h tca term sso view plain copy
轉自:http://blog.csdn.net/huangshanchun/article/details/47420961
版權聲明:歡迎轉載,如有不足之處,懇請斧正。
一個線程可以調用pthread_cancel終止同一進程中的另一個線程,但是值得強調的是:同一進程的線程間,pthread_cancel向另一線程發終止信號。系統並不會馬上關閉被取消線程,只有在被取消線程下次系統調用時,才會真正結束線程。或調用pthread_testcancel,讓內核去檢測是否需要取消當前線程。被取消的線程,退出值,定義在Linux的pthread庫中常數PTHREAD_CANCELED的值是-1。
[cpp]- #include <pthread.h>
- int pthread_cancel(pthread_t thread);
看下面程序:
- #include<stdio.h>
- #include<stdlib.h>
- #include <pthread.h>
- void *thread_fun(void *arg)
- {
- int i=1;
- 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;
- }
會發現程序再一直運行,線程無法被取消,究其原因pthread_cancel向另一線程發終止信號。系統並不會馬上關閉被取消線程,只有在被取消線程下次系統調用時,才會真正結束線程。如果線程裏面沒有執行系統調用,可以使用pthread_testcancel解決。
[cpp] view plain copy- #include<stdio.h>
- #include<stdlib.h>
- #include <pthread.h>
- void *thread_fun(void *arg)
- {
- int i=1;
- printf("thread start \n");
- while(1)
- {
- i++;
- pthread_testcancel();
- }
- 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;
- }
linux下pthread_cancel無法取消線程的原因【轉】