Linux_20170712_mysleep
来源:互联网 发布:星际边界mac 编辑:程序博客网 时间:2024/06/07 19:44
1. 编写普通版本mysleep
运行结果
2. 编写规避竞态条件的mysleep
这里我们使用sigsusupend来替代pause防止出现被无限挂起的情况
#include<stdio.h>#include<unistd.h>#include<signal.h>#include<stdlib.h>void handler(int signum){}unsigned int mysleep (unsigned int timeout){ struct sigaction act,oact; sigset_t mask,omask,suspmask; unsigned ret; act.sa_handler=handler; sigemptyset(&act.sa_mask); act.sa_flags=0; sigaction(SIGALRM,&act,&oact); sigemptyset(&mask); sigaddset(&mask,SIGALRM); sigprocmask(SIG_BLOCK,&mask,&omask); alarm(timeout);//20 suspmask = omask; sigdelset(&suspmask,SIGALRM); sigsuspend(&suspmask); ret=alarm(0);//24
运行结果
3. 对两者进行对比
相比普通版本的mysleep,系统运行的时序(Timing) sigsuspend包含了pause的挂起等待功能,同时解决了竞态条件的问题,在对时序要求严格的场合下都应该调⽤用sigsuspend而不是pause。
#include
阅读全文
0 0