关闭

pthread_cancel-linux 终止其他线程

标签: asynchronousthread存储join
1727人阅读 评论(0) 收藏 举报
分类:

 取消是一种让一个线程可以结束其它线程的机制。更好的是,一个线程可以对另一个线程发送一个结束的请求。依据设置的不同,目标线程可能会置之不理,可能会立即终止也可能会将它推迟到下一个取消点。
当一个线程最终尊重了取消的请求,它的行为就像执行了pthread_exit(PTHREAD_CANCELED):所有的清理函数句柄以相反的次序被调用,线程终止函数被调用,最终结束线程的执行,并且返回PTHREAD_CANCELED。可以查看pthread_exit(3)获得更多的信息。

1、int pthread_cancel(pthread_t thread);

    向thread发送一个取消执行的请求。如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

   

    成功返回零,出错返回非零的出错码ESRCH:没有找到thread指定ID的线程。


2、int pthread_setcancelstate(int state, int *oldstate);

    更改目标线程的取消状态,即:是否忽略这个请求。参数state是新的取消状态:要么是PTHREAD_CANCEL_ENABLE(缺省), 即允许取消,要么是PTHREAD_CANCEL_DISABLE,即不允许取消(收到的取消请求将被忽略)。如果oldstate参数非空,那么它的值会存储于oldstate参数中,以便以后其它的线程可以用这个值来恢复。

 

    成功返回零,出错返回非零的出错码EINVAL:state参数的值并非PTHREAD_CANCEL_ENABLE或PTHREAD_CANCEL_DISABLE。


3、int pthread_setcanceltype(int type, int *oldtype);

    改变目标线程对于取消请求的响应:异步的(立即执行)或是同步的(延时执行),仅当cancel状态为ENABLE时有效。参数type是新的类型:要么是PTHREAD_CANCEL_DEFERRED(缺省),挂起收到的信号直到下个取消点,要么是PTHREAD_CANCEL_ASYNCHRONOUS,请求一到达就立刻执行。如果oldtype非空,以前的取消状态会存储于oldtype中,以便以后其它线程再使用pthread_setcanceltype来恢复。

   

    用pthread_create()创建的线程常常是可取消并且延时的,即同步终结。因为默认的状态是PTHREAD_CANCEL_ENABLE,类型则是PTHREAD_CANCEL_DEFERRED。

    取消点是在程序在运行的时候检测是否收到取消请求,是否允许允许操作执行的点。下面的POSIX线程函数就是取消点:
pthread_join()
pthread_cond_wait()
pthread_cond_timedwait()
pthread_testcancel()
sem_wait()
sigwait()
所有其它的POSIX线程函数都保证不是取消点。那是因为它们从来不会在延时取消操作的模式下进行取消操作。

 

    成功返回零,出错返回非零的出错码EINVAL:type的值并非PTHREAD_CANCEL_DEFERRED 或PTHREAD_CANCEL_ASYNCHRONOUS。

 

4、void pthread_testcancel(void);

    为线程建立取消点,即在长串的代码中引入外部检测取消点而不必调用其它的取消点函数。当线程取消功能处于启用状态且取消类型设置为延迟模式时,函数有效。如果在取消功能处于禁用状态下,则该函数不起作用。

    该函数除了检查同步终结时的状态,其他什么也不做。

 

 

来自:http://blog.sina.com.cn/s/blog_590be5290100iffl.html


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:309667次
    • 积分:2809
    • 等级:
    • 排名:第13191名
    • 原创:9篇
    • 转载:104篇
    • 译文:0篇
    • 评论:14条
    最新评论