信号量:你能在等待之前发出信号吗?

时间:2013-02-22 02:05:06

标签: signals semaphore wait

我正在研究类的概念伪代码信号量赋值。

我想知道在某个进程调用了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)语句。这是真的会发生什么?或者会出现某种错误,因为你无法发出没有人在等待的信号量信号?

2 个答案:

答案 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,您无需获取它。我认为程序员的工作就是正确构建代码。在这种情况下,由于您不在第二个进程中等待信号量,因此可能会无序运行。

相关问题