unix环境高级编程——线程同步信号


#include <signal.h>
int sigwait(const sigset_t *set, int *sig);

表示等待信号集里的信号,如果有指定的信号到来,则返回。


线程之间的同步,之间已经有学过互斥量,条件等待,读写锁等,这里的线程同步信号处理,其实也是对于那些的应用,不同的是,触发条件是信号。后面的同步流程基本一样,此处是为了学习信号相关的知识。


程序实例:

主线程,先屏蔽掉两个信号:SIG_INT(ctrl+c),SIG_QUIT(ctrl+\),即不对这2个信号做反应,不然的话,主线程也会对这个做反应,而默认的反应就是退出程序(可以注册两个信号处理函数来忽略它也可以达到目的)。屏蔽完信号以后,主线程创建子线程,同时自身等待某个条件的发生。

子线程等待这两个信号,得到信号以后,打印信息,如果是SIG_QUIT,则唤醒主线程。


#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <error.h>


int quitflag;
sigset_t mask;


pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t wait=PTHREAD_COND_INITIALIZER;

//线程入口
void thr_fn(void *arg){
int err,signo;
for(;;){
err=sigwait(&mask,&signo);//wait for certain singno to come
if(err!=0){
printf("sigwait fail!%s\n",strerror(err));
exit(err);
}
switch(signo){
case SIGINT:
printf("\ninterrupt:SIGINT\n");
break;


case SIGQUIT:
pthread_mutex_lock(&lock);
quitflag=1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&wait);
return(0);
default:
printf("unexpected signal %d\n",signo);
exit(1);
}
}
}


int main(void){
int err=0;
sigset_t oldmask;
pthread_t tid;


sigemptyset(&mask);
sigaddset(&mask,SIGINT);
sigaddset(&mask,SIGQUIT);


err=pthread_sigmask(SIG_BLOCK,&mask,&oldmask);
if(err!=0){
printf("pthread sig_block fail!\n");
exit(err);
}
err=pthread_create(&tid,NULL,&thr_fn,0);
if(err!=0){
printf("pthread create fail!\n");
exit(err);
}
pthread_mutex_lock(&lock);
while(quitflag==0){
       printf("main thread:wait for condition...\n");
pthread_cond_wait(&wait,&lock);
}
pthread_mutex_unlock(&lock);
        printf("main thread wake up....\n");
quitflag=0;


err=sigprocmask(SIG_SETMASK,&oldmask,NULL);
if(err<0){
printf("set mask fail!\n");
}
exit(0);
}




问题:

1、如果主线程也能捕获这两个信号,那么子线程还能得到信号吗?

现象是不能。直接就退出来了。

将主线程的信号屏蔽语句注释掉,同时在后面加上sleep,看如何,结果是按下ctrl+c(对应SIG_INT),直接退出。

从原理上来说TODO?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值