semaphore - binary semphore - 当我们连续执行 2 sem_up 然后 2 down 时会发生什么?
问题描述
我得到了应该打印 S1-S9 的信号量代码:
void func1(int s1, int s2){
printf("S1\n");
bsem_up(s2);
printf("S5\n");
bsem_up(s2);
printf("S8\n");
printf("S9\n");
bsem_down(s1);
printf("S7\n");
bsem_up(s2);
}
void func2(int s1, int s2){
bsem_down(s2);
printf("S2\n");
printf("S3\n");
bsem_down(s2);
printf("S6\n");
bsem_up(s1);
bsem_down(s2);
printf("S4\n");
bsem_up(s2);
}
int main(){
int s1 = bsem_alloc();
int s2 = bsem_alloc();
bsem_down(s1);
bsem_down(s2);
int pid = fork();
if(pid == 0){
func1(s1, s2);
}
else{
func2(s1, s2);
}
exit(0);
}
我试图理解如果流程是这样的:bsem_up(s2);
将在 process1 上连续调用,因为这是二进制信号量,所以它就像只调用一个,对吗?据我所知,在这种情况下,当进程 2 运行 bsem_down(s2) 时,没有人会叫醒他
process 2:
bsem_down(s2);
then process 1:
printf("S1\n");
bsem_up(s2);
printf("S5\n");
bsem_up(s2); //2 bsem_up in a row in some scenrio
printf("S8\n");
printf("S9\n");
then process 2:
printf("S2\n");
printf("S3\n");
bsem_down(s2); //no one will wake him up
解决方案
推荐阅读
- vba - 我想使用我正在使用的当前数据库中的 shell 函数打开文件(YR2013.accdb)
- java - Spring Boot WebSocket 无响应
- excel - 在受保护的 VBProject 中更改工作表代码名称
- c++ - 使用模板类复制构造函数时出错
- highcharts - 如何在 HighMaps 中将 GeoJSON 对象属性设置为类名而不是名称
- javascript - 在 textarea 中查找 body 元素
- r - 用随机数计算向量中的负值
- node.js - 重启后 Node.js 执行冻结
- reactjs - 发布请求在 react-native redux 中不起作用
- reactjs - React:如何构建孩子