1. 程式人生 > >linux下pthread_cancel無法取消線程的原因【轉】

linux下pthread_cancel無法取消線程的原因【轉】

null alt 使用 comm urn stdio.h tca term sso

轉自:http://blog.csdn.net/huangshanchun/article/details/47420961

一個線程可以調用pthread_cancel終止同一進程中的另一個線程,但是值得強調的是:同一進程的線程間,pthread_cancel向另一線程發終止信號。系統並不會馬上關閉被取消線程,只有在被取消線程下次系統調用時,才會真正結束線程。或調用pthread_testcancel,讓內核去檢測是否需要取消當前線程。被取消的線程,退出值,定義在Linux的pthread庫中常數PTHREAD_CANCELED的值是-1。

[cpp]
view plain copy
  1. #include <pthread.h>
  2. int pthread_cancel(pthread_t thread);


看下面程序:

[cpp] view plain copy
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <pthread.h>
  4. void *thread_fun(void *arg)
  5. {
  6. int i=1;
  7. printf("thread start \n");
  8. while(1)
  9. {
  10. i++;
  11. }
  12. return (void *)0;
  13. }
  14. int main()
  15. {
  16. void *ret=NULL;
  17. int iret=0;
  18. pthread_t tid;
  19. pthread_create(&tid,NULL,thread_fun,NULL);
  20. sleep(1);
  21. pthread_cancel(tid);//取消線程
  22. pthread_join(tid, &ret);
  23. printf("thread 3 exit code %d\n", (int)ret);
  24. return 0;
  25. }

技術分享圖片

技術分享圖片

會發現程序再一直運行,線程無法被取消,究其原因pthread_cancel向另一線程發終止信號。系統並不會馬上關閉被取消線程,只有在被取消線程下次系統調用時,才會真正結束線程。如果線程裏面沒有執行系統調用,可以使用pthread_testcancel解決。

[cpp] view plain copy
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <pthread.h>
  4. void *thread_fun(void *arg)
  5. {
  6. int i=1;
  7. printf("thread start \n");
  8. while(1)
  9. {
  10. i++;
  11. pthread_testcancel();
  12. }
  13. return (void *)0;
  14. }
  15. int main()
  16. {
  17. void *ret=NULL;
  18. int iret=0;
  19. pthread_t tid;
  20. pthread_create(&tid,NULL,thread_fun,NULL);
  21. sleep(1);
  22. pthread_cancel(tid);//取消線程
  23. pthread_join(tid, &ret);
  24. printf("thread 3 exit code %d\n", (int)ret);
  25. return 0;
  26. }


技術分享圖片

linux下pthread_cancel無法取消線程的原因【轉】