c - 当两个信号量同时变化并且两个信号量之一不能立即递减时会发生什么?
问题描述
考虑这段代码:
struct sembuf s_op[2];
s_op[0].sem_num = old;
s_op[0].sem_op = 1;
s_op[0].sem_flg = 0;
s_op[1].sem_num = new;
s_op[1].sem_op = -1;
s_op[1].sem_flg = 0;
semop(semid, s_op, 2);
现在,如果不能立即减少“新”信号量(因为它已经为 0),是否会有一个时间间隔,“旧”信号量增加而“新”信号量没有增加?我的意思是,这总是会自动发生吗?
解决方案
是否会有一个“旧”信号量增加而“新”信号量没有增加的时间间隔?
这是一个实现细节。实现可以检查操作是否可能,然后执行操作,或者一个接一个地执行操作,如果一个操作不能完成,则恢复已经完成的操作。或者实现可能根本不做任何事情,直到下一个sem*
操作并查询操作,等等。底部是任何一种方式,只有可观察的状态才是重要的,而这种状态增加而另一个不增加不能任何进程都可以观察到,因为操作是“原子地”完成的。
这总是能自动发生吗?
是的,“原子地”意味着没有进程可以观察到操作中间的状态。这并不意味着这种状态“不存在”,因为内核必须一个接一个地查询一个操作。这意味着无法从使用 POSIX api 的进程中观察到这种状态。
推荐阅读
- asp.net - 如何在 windows iis 上设置 asp.net web 应用程序
- javascript - 当输入类型=“日期”中的某些内容发生更改时,是否可以触发输入/更改事件?
- reactjs - 忽略 React Hook "React.useEffect" 可能会执行多次
- javascript - Old Edge - 如何创建“图像”对象?
- r - 如何根据另一列中的值比较数据框中单个列中的两个因子,如果它们不匹配则删除它们
- javascript - Axios 从 dart 的渡槽获取令牌
- google-cloud-platform - 如何将我的 gcloud 用户凭据安全地放入容器中,并在本地测试时使用它们来模拟服务帐户?
- php - Powershell 加密和 PHP 解密字符串问题
- java - 使用 JdbcBatchItemWriter 在 mysql db 中保存时值更改
- c - xv6 在哪里实现 fifo 和 lifo