linux线程的取消(终止)方法

更新时间:2023-07-08 07:44:10 阅读: 评论:0

linux线程的取消(终⽌)⽅法
关键:
pthread_cancel函数发送终⽌信号
pthread_tcancelstate函数设置终⽌⽅式
pthread_testcancel函数取消线程(另⼀功能是:设置取消点)
1 线程取消的定义
⼀般情况下,线程在其主体函数退出的时候会⾃动终⽌,但同时也可以因为接收到另⼀个线程发来的终⽌(取消)请求⽽强制终⽌。网络与生活
2 线程取消的语义
线程取消的⽅法是向⽬标线程发Cancel信号(pthread_cancel函数发送Cancel信号),但如何处理Cancel信号则由⽬标线程⾃⼰决定,或者忽略、或者⽴即终⽌、或者继续运⾏⾄Cancelation-point(取消点),由不同的Cancelation状态
(pthread_tcancelstate函数设置状态)决定。
线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运⾏⾄取消点,也就是说设置⼀个CANCELED状态,线程继续运⾏,只有运⾏⾄Cancelation-point的时候才会退出。
3 取消点
根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、m_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调⽤都是Cancelation-point,⽽其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的⼿册页声称,由于LinuxThread库与C库结合得不好,因⽽⽬前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调⽤中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调⽤前后调⽤ pthread_testcancel(),从⽽达到POSIX标准所要求的⽬标,即如下代码段:pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();
4 程序设计⽅⾯的考虑
如果线程处于⽆限循环中,且循环体内没有执⾏⾄取消点的必然路径,则线程⽆法由外部其他线程的取消请求⽽终⽌。因此在这样的循环体的必经路径上应该加⼊pthread_testcancel()调⽤。
5 与线程取消相关的pthread函数
int pthread_cancel(pthread_t thread)
发送终⽌信号给thread线程,如果成功则返回0,否则为⾮0值。发送成功并不意味着thread会终⽌。
int pthread_tcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和
PTHREAD_CANCEL_DISABLE,分别表⽰收到信号后设为CANCLED状态和忽略CANCEL信号继续运⾏;old_state如果不为 NULL则存⼊原来的Cancel状态以便恢复。
int pthread_tcanceltype(int type, int *oldtype)
设置本线程取消动作的执⾏时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和
PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表⽰收到信号后继续运⾏⾄下⼀个取消点再退出和⽴即执⾏取消动作(退出);oldtype如果不为NULL则存⼊运来的取消动作类型值。
void pthread_testcancel(void)
功能⼀:设置取消点;
功能⼆:检查本线程是否处于Canceld状态,如果是,则进⾏取消动作,否则直接返回。
代码:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_MAX 4
pthread_mutex_t mutex;理财规划师
pthread_t thread[THREAD_MAX];
static int tries;
static int started;
void print_it(int *arg)
{
pthread_t tid;
tid = pthread_lf();
printf("Thread %lx was canceled on its %d try.\n",tid,*arg);
}
void *Search_Num(int arg)
{
pthread_t tid;
int num;
int k=0,h=0,j;
int ntries;
tid = pthread_lf();
/*while(pthread_mutex_trylock(&mutex) == EBUSY)
{
printf("**************busy****************\n");
pthread_testcancel();
}*/
srand(arg);
num = rand()&0xFFFFFF;
//pthread_mutex_unlock(&mutex);
printf("thread num %lx\n",tid);
ntries = 0;
pthread_tcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_tcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
pthread_cleanup_push((void *)print_it,(void *)&ntries);
while(1)
{
num = (num+1)&0xffffff;
ntries++;
if(arg == num)
{
//只允许⼀个线程操作此处
while(pthread_mutex_trylock(&mutex) == EBUSY) {
//⼀个线程操作后其余线程进⼊次循环挂起,等待pthread_cancel函数发送cancel信号终⽌线程
乡土中国每章概括k++;
if(k == 10000)
{
printf("----------2busy2-----------\n");
}
药家鑫的话应验了pthread_testcancel();
}
tries = ntries;
//pthread_mutex_unlock(&mutex);  //如果加上这句话,将会有好⼏个线程找到主函数中设定的值pid printf("Thread %lx found the number!\n",tid);
小班月计划图图简笔画for(j = 0;j<THREAD_MAX;j++)
{
if(thread[j]!=tid)
{
pthread_cancel(thread[j]);
做家务感悟
}
}
break;
}
if(ntries%100 == 0)
{
h++;
/*线程阻塞,其他线程争夺资源,或者是等待pthread_cancel函数发送cancel信号终⽌线程*/
pthread_testcancel();
/*这是为了弄明⽩pthread_testcancel函数的作⽤⽽设置的代码段*/
if(h == 10000)
{
h = 0;
printf("----------thread num %lx-------------\n",tid);
}
}
}
pthread_cleanup_pop(0);
return (void *)0;
}
int main()
{
int i,pid;
pid = getpid(); //设置要查找的数
pthread_mutex_init(&mutex,NULL);
printf("Search the num of %d\n",pid);
for(started = 0; started < THREAD_MAX; started++)
{
pthread_create(&thread[started],NULL,(void *)Search_Num,(void *)pid);
}
for(i = 0; i < THREAD_MAX; i++)
{
printf("-----------i = %d--------------\n",i);
pthread_join(thread[i],NULL);
}
printf("It took %d tries ot find the number!\n",tries);
return 0;
}
运⾏结果:
Search the num of 6531
-----------i = 0--------------
thread num b6fbcb70
thread num b67bbb70
thread num b5fbab70
thread num b77bdb70
-
---------thread num b67bbb70-------------
民族工艺品
Thread b67bbb70 found the number!
----------thread num b6fbcb70-------------
----------thread num b77bdb70-------------
----------2busy2-----------
----------thread num b5fbab70-------------
----------2busy2-----------
Thread b5fbab70 was canceled on its 1174527 try.
Thread b77bdb70 was canceled on its 1023100 try.
-----------i = 1--------------
Thread b6fbcb70 was canceled on its 1174527 try.
-
----------i = 2--------------
-----------i = 3--------------
It took 1174527 tries ot find the number!
从这结果⾥你有没有看出什么呢?呵呵~.~
以上就是⼩编为⼤家带来的linux线程的取消(终⽌)⽅法全部内容了,希望⼤家多多⽀持~

本文发布于:2023-07-08 07:44:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1072666.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   取消   信号   函数   状态   设置
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图