Linux线程取消

Linux线程可以取消其他线程,被取消的线程会被退出

线程本身可以设置不被其他线程取消

 

相关函数

int pthread_cancel(pthread_t thread);  //同一进程的线程取消其他线程

int pthread_setcancelstate(int state, int *oldstate);//设置线程取消

int pthread_setcanceltype(int type, int *oldtype);//在还没到达取消点时,可以通过这个修改取消类型
void pthread_testcancel(void);  //自己添加取消点	

线程  state   可以设置位这两种方式:

PTHREAD_CANCEL_ENABLE 线程是可取消的,这是所有新线程的默认取消状态
PTHREAD_CANCEL_DISABLE 线程是不可取消的,如果接收到取消请求,它将被阻塞,直到可以celability启用。

 

线程启动时默认的可取消状态是PTHREAD CANCEL-ENABLE。

 

当状态设为PTHREAD CANCEL-DISABLE时,对pthread_cancel的调用并不会杀死线程。

相反,取消请求对这个线程来说还处于挂起状态,

当取消状态再次变为PTHREAD-CANCEL-ENABLE时,线程将在下一个取消点上对所有挂起的取消请求进行处理。

操作步骤:

  1. 把线程A的state设置为PTHREAD CANCEL-DISABLE
  2. 线程B向线程A发送取消信号
  3. 线程A收到取消信号,阻塞该信号
  4. 把线程A的state设置为PTHREAD-CANCEL-ENABLE
  5. 线程A执行取消信号,中止线程

注意:

这里恢复线程可以取消后,不是一恢复马上就把线程中止,而是运行到下面的函数后才可以取消,

我们自己也可以添加取消点,用void pthread_testcancel(void);  这里的函数没列举全

把线程状态设置为PTHREAD CANCEL-DISABLE的实例代码:

#include <pthread.h>
#include <stdio.h>
#include <string.h>

pthread_t tid1, tid2, tid3;

void* th_reader1(void *p)
{
	int i = 1;
	int oldstate = -1;
	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
    for(; i <= 5; i++)
	{
		printf("func[%s]: 第 %d 秒\n", __FUNCTION__, i);
		sleep(1);
	}
	pthread_exit( (void *)0 );
}

int main()
{
    void *ret1, *ret2, *ret3;		
	
    printf("start thread reader 1\n");
    pthread_create(&tid2, NULL, th_reader1, NULL);  //创建 读 线程1
    
    sleep(2);
    pthread_cancel(tid2);  //发送取消信号
	
    pthread_join(tid2, &ret2);

    return 0;
}

运行结果:

# ./a.out 
start thread reader 1
func[th_reader1]: 第 1 秒
func[th_reader1]: 第 2 秒
func[th_reader1]: 第 3 秒
func[th_reader1]: 第 4 秒
func[th_reader1]: 第 5 秒

把线程状态设置为PTHREAD CANCEL-DISABLE后,再设置为PTHREAD-CANCEL-ENABLE的实例代码:

#include <pthread.h>
#include <stdio.h>
#include <string.h>

pthread_t tid1, tid2, tid3;

void* th_reader1(void *p)
{
	int i = 1;
	int oldstate = -1;
	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
    for(; i <= 5; i++)
	{
		printf("func[%s]: 第 %d 秒\n", __FUNCTION__, i);
		sleep(1);
		if(4 == i)
		{
			pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
			printf("thread cancel PTHREAD-CANCEL-ENABLE \n");
			pthread_testcancel();						
		}
	}
	pthread_exit( (void *)0 );
}

int main()
{
    void *ret1, *ret2, *ret3;		
	
    printf("start thread reader 1\n");
    pthread_create(&tid2, NULL, th_reader1, NULL);  //创建 读 线程1
    
    sleep(2);
    pthread_cancel(tid2);//发送取消信号
	
    pthread_join(tid2, &ret2);


    return 0;
}

运行结果:

# ./a.out 
start thread reader 1
func[th_reader1]: 第 1 秒
func[th_reader1]: 第 2 秒
func[th_reader1]: 第 3 秒
func[th_reader1]: 第 4 秒
thread cancel PTHREAD-CANCEL-ENABLE 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值