c语言如何释放一个被阻塞住的线程

xiaoxiao2021-03-01  20

问:在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标准所要求的目标。

 

转载请注明原文地址: https://www.6miu.com/read-3849975.html

最新回复(0)