【问题标题】:Semaphores: Can you signal before wait?信号量:你能在等待之前发出信号吗?
【发布时间】:2013-02-07 13:38:19
【问题描述】:

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

我想知道是否可以在某个进程调用 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) 语句。这真的会发生吗?还是会因为您无法发出没有人在等待的信号量而导致某种错误?

【问题讨论】:

    标签: signals semaphore wait


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这很有道理。
    • 我想知道作为竞争条件遇到这种情况是否表明存在更深层次的问题,也许信号量不是正确的解决方案。我想这取决于情况。
    【解决方案2】:

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

    【讨论】:

    • 为什么要在第二个进程中等待信号量?无论如何我都希望它先运行。
    • 假设第一个进程首先运行。它将等待信号量,获取它,打印,然后终止。没有什么能阻止它先运行。
    • 首先运行或未运行的不是进程,而是打印语句。阻止第一个进程首先打印的是 wait(x) 语句。假设第一个进程首先运行。它将开始,然后在 wait(x) 行停止。它不会超过这一点。直到第二个进程开始并调用 signal(x) 行,process1 才会继续。我的问题是,如果第二个进程首先开始并在第一个进程调用 wait(x) 之前调用 signal(x) 会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多