我正在研究类的概念伪代码信号量赋值。
我想知道在某个进程调用了wait()之前是否可以在信号量上调用signal()。例如:
Shared data:
Semaphore x = 0;
Process 1:
wait(x);
print("I'm Process 1, and Process 2 has already printed!");
terminate();
Process 2:
print("I'm Process 2!");
signal(x);
terminate();
上面的假设是不保证首先运行哪个进程,但我们希望print语句以正确的顺序执行(进程1之前的进程2)。如果进程1启动,它将等待x。然后,进程2将进行打印,发出信号x,并允许进程1进行打印。
但是,如果进程2启动,它将在进程1等待它之前发出信号x。期望的结果是x现在将为进程1“预先发出信号”,以便它将跳过wait(x)语句。这是真的会发生什么?或者会出现某种错误,因为你无法发出没有人在等待的信号量信号?
答案 0 :(得分:2)
信号量的wait()和signal()定义如下
**wait**(Semaphore S)
{
while S<=0
; //no operation
S--;
}
**signal**(S)
{
S++;
}
在您的代码中,信号量初始化为零(信号量x = 0),如果您尝试等待它,那么从等待的定义中可以看出该进程被阻止。这意味着第一个进程永远不会继续调用信号()来自第二个过程。
如果第二个进程首先执行(signal()),则信号量的值增加1,这样等待的任何进程都可以继续等待。(即,进程2得到wait()它会立即进行)
答案 1 :(得分:0)
根据this,您无需获取它。我认为程序员的工作就是正确构建代码。在这种情况下,由于您不在第二个进程中等待信号量,因此可能会无序运行。