C中的以下信号量应用程序如何工作?

时间:2012-01-04 20:08:11

标签: c semaphore

这是使用信号量进行任务同步的伪代码。 该操作涉及传输数据之间的安全检查。

Begin_Security_Check=create_semaphore(0);
Security_Check_Done=create_semaphore(0);

Task Security_Check
{
    while(true)
    {
        wait_semaphore(Begin_Security_Check);
          (*actions check data*)
        signal_semaphore(Security_Check_Done);
    }
}

Task Download_Data;
{
      (*actions to download data from WAN to router buffer*)
    signal_semaphore(Begin_Security_Check);

    wait_semaphore(Security_Check_Done);
      (*actions to download data from router buffer to LAN*)
}

在我读的笔记中:

s = create_semaphore(v); 其中v = 0或1

wait_semaphore(一个或多个); 如果s = 1,则设置s = 0并允许调用任务继续,否则暂停调用任务。

signal_semaphore(一个或多个); 如果没有任务等待信号量sthen set s = 1,否则恢复正在等待信号量的任务。


但这意味着wait_semaphore(Begin_Security_Check);的值为0,因为Begin_Security_Check=create_semaphore(0);,对吧?这意味着它应该暂停调用任务吗? 前两个定义有create_semaphore(0); - 这意味着它们都是相同的?

我真的很困惑,有人可以一步一步地解释这个伪代码是如何运行的吗?

2 个答案:

答案 0 :(得分:2)

你是对的,如果Security_Check在其他任何事情发生之前进入wait_semaphore,它就会等待。但是请注意Download_Data做的第一件事(wrt信号量):它表示非常信号量,它会唤醒Security_Check。这完全是您想要的同步类型。

答案 1 :(得分:1)

最初我们创建两个信号量,每个信号量的值为0.

现在我猜这两个Tasks以某种方式在不同的线程上启动 - 特别是Task Security_Check似乎永远循环,所以它必须坐在自己的线程中等待工作。当它呼叫wait_semaphore(Begin_Security_Check);时,它会暂停,直到有人发出Begin_Security_Check信号。

现在有人打电话给Download_Data。它可以执行下载数据所需的任何操作,然后发出信号量Begin_Security_Check的信号。这会唤醒Security_Check线程,然后该线程继续执行它需要做的任何事情并发出Security_Check_Done信号量的信号。同时,下载线程将继续wait_semaphore(Security_Check_Done);,导致它暂停,直到Task Security_Check信号表示信号量。因此,在安全检查完成之前不会继续。