pthread_cancel-linux 终止其他线程

转载 2012年03月29日 10:17:36

 取消是一种让一个线程可以结束其它线程的机制。更好的是,一个线程可以对另一个线程发送一个结束的请求。依据设置的不同,目标线程可能会置之不理,可能会立即终止也可能会将它推迟到下一个取消点。
当一个线程最终尊重了取消的请求,它的行为就像执行了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


相关文章推荐

linux下pthread_cancel无法取消线程的原因

一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消...

Linux--多线程之线程的取消pthread_cancel

#include "apue.h" /** pthread_cancel(pthread_t tid) 取消tid指定的线程 成功返回0 取消只是发送一个请求 会不正常的终止线程 pthread_...

linux多线程之pthread_cancel结束线程

摘要: 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死...

线程取消(pthread_cancel)

基本概念 pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行, 直到到达某个取消点(CancellationPoint)...

线程取消(pthread_cancel)

基本概念 pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行, 直到到达某个取消点(CancellationPoint)...
  • lsm424
  • lsm424
  • 2016年04月10日 22:04
  • 151

线程之线程取消(pthread_cancel)

基本概念 pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行, 直到到达某个取消点(CancellationPoint)。取...
  • big_bit
  • big_bit
  • 2016年05月09日 16:08
  • 222

线程的取消pthread_cancel()函数(线程三)

一、线程取消相关函数 1pthread_cancel().线程取消函数 成功返回0,失败返回错误码。 2.pthread_setcancelstate().设置线程取消状态 成功...

linux多线程---pthread_cancel

线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和...

使用 pthread_testcancel 作为pthread_cancel 时 线程的退出点函数

pthread_testcancel()--Create Cancellation PointSyntax  #include void pthread_testcancel(void);Thread...

Linux 线程Pthread(一)创建、终止、获取TID

Linux线程 Pthread简介
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pthread_cancel-linux 终止其他线程
举报原因:
原因补充:

(最多只允许输入30个字)