首页 > 解决方案 > 当两个信号量同时变化并且两个信号量之一不能立即递减时会发生什么?

问题描述

考虑这段代码:

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),是否会有一个时间间隔,“旧”信号量增加而“新”信号量没有增加?我的意思是,这总是会自动发生吗?

标签: cposixipcsemaphoreatomic

解决方案


是否会有一个“旧”信号量增加而“新”信号量没有增加的时间间隔?

这是一个实现细节。实现可以检查操作是否可能,然后执行操作,或者一个接一个地执行操作,如果一个操作不能完成,则恢复已经完成的操作。或者实现可能根本不做任何事情,直到下一个sem*操作并查询操作,等等。底部是任何一种方式,只有可观察的状态才是重要的,而这种状态增加而另一个不增加不能任何进程都可以观察到,因为操作是“原子地”完成的。

这总是能自动发生吗?

是的,“原子地”意味着没有进程可以观察到操作中间的状态。这并不意味着这种状态“不存在”,因为内核必须一个接一个地查询一个操作。这意味着无法从使用 POSIX api 的进程中观察到这种状态。


推荐阅读