这是使用信号量进行任务同步的伪代码。 该操作涉及传输数据之间的安全检查。
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);
- 这意味着它们都是相同的?
我真的很困惑,有人可以一步一步地解释这个伪代码是如何运行的吗?
答案 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
信号表示信号量。因此,在安全检查完成之前不会继续。