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

Pet*_*ger 4 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();
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

**wait**(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}
**signal**(S)
{
   S++;
}
Run Code Online (Sandbox Code Playgroud)

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

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