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;
}
總結
以上是生活随笔為你收集整理的linux下 如何用信号signal 终止或者暂停子线程,linux下实现线程暂停的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本根据cookies自动登
- 下一篇: 随机森林降维matlab代码,随机森林代