信号量值大于初始值
Semaphore value greater than initialized value
我正在 Linux 中处理信号量。我想知道信号量值是否可以增加到超过初始化值?如果是这样,那什么时候可以发生?
例如信号量值初始化为1。
如果我用up(sem)连续递增两次,信号量的值会不会递增超过1。
x(void){
sema_init(sem1, 1);
down(sem1);
{
.
. // some code implementation
.
}
up(sem1); // i understand this increment the value back to 1.
up(sem1);
/* what exactly does this statement do to the semaphore?
Will it increment the value to 2? If so what is the meaning of this statement? */
}
是的,它会将其递增到 2。效果是接下来的两个信号量向下调用将 运行 而不会阻塞。信号量的一般用例是保护资源池。如果有 1 个资源,则信号量的最大预期值为 1。如果有 2 个资源,则最大预期值为 2,依此类推。因此,将信号量增加到 2 是否正确取决于上下文。如果在任何给定时间只有 1 个进程应该通过信号量,那么递增到 2 是代码中的错误。如果允许 2 个或更多进程,则允许增加到 2。
这是一个简化的解释。有关详细信息,请查看 "counting semaphores"。您可能想到的另一种信号量是 "binary semaphores",它是 0 或 1。
我正在 Linux 中处理信号量。我想知道信号量值是否可以增加到超过初始化值?如果是这样,那什么时候可以发生?
例如信号量值初始化为1。 如果我用up(sem)连续递增两次,信号量的值会不会递增超过1。
x(void){
sema_init(sem1, 1);
down(sem1);
{
.
. // some code implementation
.
}
up(sem1); // i understand this increment the value back to 1.
up(sem1);
/* what exactly does this statement do to the semaphore?
Will it increment the value to 2? If so what is the meaning of this statement? */
}
是的,它会将其递增到 2。效果是接下来的两个信号量向下调用将 运行 而不会阻塞。信号量的一般用例是保护资源池。如果有 1 个资源,则信号量的最大预期值为 1。如果有 2 个资源,则最大预期值为 2,依此类推。因此,将信号量增加到 2 是否正确取决于上下文。如果在任何给定时间只有 1 个进程应该通过信号量,那么递增到 2 是代码中的错误。如果允许 2 个或更多进程,则允许增加到 2。
这是一个简化的解释。有关详细信息,请查看 "counting semaphores"。您可能想到的另一种信号量是 "binary semaphores",它是 0 或 1。