4

我正在为一个类进行概念性伪代码信号量分配。

我想知道是否可以在某个进程调用 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();

上面的假设是不能保证哪个进程首先运行,但我们希望打印语句以正确的顺序执行(进程 2 在进程 1 之前)。如果进程 1 启动,它将等待 x。然后进程 2 将进行打印,向 x 发出信号,并允许进程 1 进行打印。

但是,如果进程 2 启动,它将在进程 1 等待它之前发出 x 信号。期望的结果是 x 现在将被“预先通知”进程 1,以便它会直接跳过 wait(x) 语句。这真的会发生吗?还是会出现某种错误,因为您无法发出没有人在等待的信号量?

4

2 回答 2

4

信号量的 wait() 和 signal() 定义如下

**wait**(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}
**signal**(S)
{
   S++;
}

在您的代码中,信号量初始化为零(Semaphore x = 0),如果您尝试等待它,该进程将被阻塞,正如您从等待的定义中看到的那样。这意味着第一个进程永远不会继续调用 signal() 从第二个过程。

如果第二个进程首先执行(signal()),则信号量的值会增加 1,因此任何等待此的进程都可以继续等待。(即,进程 2 得到 wait(),它会立即继续)

于 2013-02-27T07:31:40.690 回答
0

据此,您不必获取它我认为正确地构建代码是程序员的工作。在这种情况下,由于您不等待第二个进程中的信号量,它可能会出现故障。

于 2013-02-22T02:13:16.167 回答