pthread 立即停止线程_pthread 线程立即取消的两种方法

1.相关函数介绍

a.

int pthread_cancel(pthread_t thread)

发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

b.

int pthread_setcancelstate(int state, int *oldstate)

设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,

分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为NULL则存入原来的Cancel状态以便恢复。

c.

int pthread_setcanceltype(int type, int *oldtype)

设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFERED和PTHREAD_CANCEL_ASYNCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出,线程以下程序不执行);oldtype如果不为NULL则存入运来的取消动作类型值。

d.

void pthread_testcancel(void)

pthread_testcancel在不包含取消点,但是又需要取消点的地方创建一个取消点,以便在一个没有包含取消点的执行代码线程中响应取消请求。

线程取消功能处于启用状态且取消状态设置为延迟状态时,pthread_testcancel()函数有效。 如果在取消功能处处于禁用状态下调用pthread_testcancel(),则该函数不起作用。

取消点:

线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。

pthreads标准指定了几个取消点,其中包括:

(1)通过调用pthread_testcancel()以编程方式建立线程取消点。

(2)线程等待pthread_cond_wait或pthread_cond_timewait()中的特定条件。

(3)被sigwait(2)阻塞的函数

(4)一些标准的库调用。通常,这些调用包括线程可基于阻塞的函数。

根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及

read()、write()等会引起阻塞的系统调用都是Cancelation-point

e.

int pthread_join(pthread_t thread, void **value_ptr);

thread:等待退出线程的线程号。

value_ptr:退出线程的返回值。

1.同步取消线程

代码示例:

#include#include#include

void *thread_fun(void *arg)

{int i=1;

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);/*同步取消,等到下一个取消点再取消*/pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

printf("thread start \n");while(1)

{

i++;/*手动建立一个取消点, 防止线程中无取消点,导致线程不取消。*/pthread_testcancel();

}return (void *)0;

}intmain()

{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;

}

2.异步取消线程

示例代码:

#include#include#include

void *thread_fun(void *arg)

{int i=1;

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);/*同步取消,等到下一个取消点再取消*/

//pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

/*异步取消, 线程接到取消信号后,立即退出*/pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

printf("thread start \n");while(1)

{

i++;

}return (void *)0;

}intmain()

{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;

}

代码编译:

gcc pthread_test.c -o pthread_test -lpthread

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pthread_testcancel 和 pthread_cancel 是多线程编程中用于线程交互的两个重要函数,它们可以协调多个线程的执行,实现线程的安全退出和资源释放。 下面是 pthread_testcancel 和 pthread_cancel 的线程交互模型: 1. 主线程创建一个新线程,并向新线程发送取消请求,同时将新线程取消状态设置为 PTHREAD_CANCEL_ENABLE,以确保新线程可以响应取消请求。 2. 新线程在执行任务时,不断使用 pthread_testcancel 函数检测是否收到取消请求,如果收到了取消请求,就立即退出线程函数。 3. 如果新线程正在阻塞等待或者 sleep 等待,那么就会立即响应取消请求,退出阻塞状态或者 sleep 等待,然后立即退出线程函数。 4. 如果新线程没有收到取消请求,就会继续执行任务,直到任务完成或者收到取消请求为止。 5. 如果主线程需要取消线程的执行,可以调用 pthread_cancel 函数向新线程发送取消请求,让新线程在适当的时候退出执行。 6. 如果新线程没有及时响应取消请求,那么就会出现线程无法退出的情况,从而导致资源泄露和程序异常等问题。 7. 在编写多线程程序时,需要注意线程安全性和取消操作的使用,避免竞争条件和死锁等问题,确保程序能够正确安全地运行。 总之,pthread_testcancel 和 pthread_cancel 是多线程编程中用于线程交互的两个重要函数,它们可以协调多个线程的执行,实现线程的安全退出和资源释放。在多线程编程中,需要注意线程安全性和取消操作的使用,避免竞争条件和死锁等问题,确保程序能够正确安全地运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值