apue练习题

来源:互联网 发布:淘宝为什么比京东便宜 编辑:程序博客网 时间:2024/06/05 02:11
//sleep的线程安全实现//#ifndef _PTHREAD_12_6#define _PTHREAD_12_6#include<pthread.h>#include"apue.h"#include<signal.h>#include<unistd.h>static void sig_alarm(int signo){  /*do nothing*/}unsigned int sleep(unsigned nsecs){  sigset_t newmask,oldmask,mask;  sigemptyset(&newmask);  int signo;  sigaddset(&newmask,SIGALRM);  int err,unsleep;  err=pthread_sigmask(SIG_BLOCK,&newmask,&oldmask);//首先利用线程屏蔽信号函数将SIGALRM信号加入到信号屏蔽字中,对应到进程级信号处理函数就是sigprocmask  if(err!=0)  cout<<err<<"pthread_sigmask"<<endl;  alarm(nsecs);  mask=oldmask;  sigdelset(&mask,SIGALRM);//确保新的信号屏蔽字中没有将SIGALRM屏蔽  sigwait(&mask,&signo);//sigwait函数恢复oldmask屏蔽字,对应到进程级信号处理函数就是sigsuspend  unsleep=alarm(0);  if(signo==SIGALRM)  sig_alarm;//这里是否需要创建一个线程来处理信号处理函数?  pthread_sigmask(SIG_SETMASK,&oldmask,NULL);//pthread_sigmask是否影响别的线程的屏蔽字  return unsleep;}#endif

这里的关键点是理解进程级信号处理函数和线程级信号处理函数,进程级信号处理函数影响的是进程,线程级信号处理函数影响的是线程!

还有就是在线程中的信号处理函数的处理,apue中提到在线程中可以另外创建一个线程来单独处理信号处理函数,而不是单纯利用信号处理函数,主要是因为在线程中,信号处理函数是全局的,一个线程设置的信号处理函数可以被其他线程修改!本文没有另外创建线程来单独处理,后续会利用其他线程替代在主线程中的信号处理!!!

0 0