第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > linux下 如何用信号signal 终止或者暂停子线程 linux下实现线程暂停

linux下 如何用信号signal 终止或者暂停子线程 linux下实现线程暂停

时间:2018-11-27 08:50:38

相关推荐

linux下 如何用信号signal 终止或者暂停子线程 linux下实现线程暂停

记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个。。

刚开始就想到用信号(没办法,正在看auep,只能想到这个)

test1:

用pthread_kill将SIGSTOP信号发送到要暂停的线程

期望结果:线程暂停

实际结果:进程暂停

结论:oh, shit,查了查书·信号是进程范围的,还有SIGSTOP是无法捕获的,失败·

于是,又想了个方法:

test2:

还有用信号,不过这次改用自定义的SIGUSR1(用于挂起)和SIGUSR2(用于唤醒)

在SIGUSR1处理函数中等待SIGUSR2信号就好了呀··

但问题就来了,书上信号是进程范围的,按照我的理解现进程中的所有线程应该都被挂起才是,

要是把处理函数中阻塞在这··,这程序不是不能跑了·

结论:想想都觉得不可能,所以就放弃了

接下来就是一番baidu,google,终于在一个论坛找到了(地址忘了),想法跟上面test2的基本一致,接下来就是依葫芦画瓢了,

有了下面的小程序,有问题希望不吝指出!!

总结:一、对signal的处理还不是很理解

1、signal是在接收的线程执行处理函数,不影响其它线程?

二、不要轻易放弃自己的想法,不要过早认定“这不可能的,绝对地”

三、东西不是think出来的,是do出来 的,有了想法就去do

问题:1、很多函数不是异步信号安全的,所以这样做基本无意义···,汗··

#include

#include

#include

#include

#define SIGRESUME SIGUSR2

#define SIGSUSPEND SIGUSR1

/* Thread specied var, the status*/

static __thread int g_bSuspend;

void* task1(void *param)

{

while(1)

{

printf("***************************\n");

sleep(1);

}

}

void* task2(void *param)

{

while(1)

{

printf("##############################\n");

sleep(2);

}

}

void suspend_handler(int signum)

{

g_bSuspend = 1;

sigset_t nset;

pthread_sigmask(0, NULL, &nset);

/* make sure that the resume is not blocked*/

sigdelset(&nset, SIGRESUME);

while(g_bSuspend) sigsuspend(&nset);

}

void resume_handler(int signum)

{

g_bSuspend = 0;

}

int suspend( pthread_t thread)

{

return pthread_kill( thread, SIGSUSPEND);

}

int resume( pthread_t thread)

{

return pthread_kill (thread, SIGRESUME);

}

int main()

{

struct sigaction suspendsa = {0};

struct sigaction resumesa = {0};

suspendsa.sa_handler = suspend_handler;

sigaddset(&suspendsa.sa_mask, SIGRESUME);

sigaction( SIGSUSPEND, &suspendsa, NULL);

resumesa.sa_handler = resume_handler;

sigaddset(&resumesa.sa_mask, SIGSUSPEND);

sigaction( SIGRESUME, &resumesa, NULL);

pthread_t runTh1;

pthread_t runTh2;

pthread_create(&runTh1, NULL, task1, NULL);

pthread_create(&runTh2, NULL, task2, NULL);

while( 1 )

{

getchar();

suspend( runTh1);

suspend( runTh2);

//sleep(5);

resume( runTh1);

sleep(5);

resume( runTh2);

}

return 0;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。