これは、セマフォを使用するタスク同期のための擬似コードです。 操作には、データの転送とセキュリティチェックが必要です。私が読んでいるノートでCの次のセマフォアプリケーションはどのように機能しますか?
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); s = 1の場合、s = 0と設定して呼び出し側のタスクを進めるか、そうでない場合は呼び出し側のタスクを中断します。
signal_semaphore(s); セマフォを待っているタスクがない場合sthen set s = 1そうでない場合は、セマフォを待っているタスクを再開します。
しかし、これはwait_semaphore(Begin_Security_Check);
は右、0 Begin_Security_Check=create_semaphore(0);
ための値を有することを意味しますか?つまり、呼び出し元のタスクを中断する必要がありますか? 最初の2つの定義はcreate_semaphore(0);
です。つまり、両方とも同じですか?
私は本当に混乱しています。ステップバイステップでこの疑似コードの実行方法を説明してください。
これは、wait_semaphore(Begin_Security_Check);でコードが停止し、通知されるまでコードが次のコードに移動することを意味します。その後、 'signal_semaphore(Begin_Security_Check);にシグナルを送り、最初のループに戻り'(* actions check data *) 'を実行するまで、'(WANからルータバッファ*へのデータをダウンロードするための ' 'など..これは正しいのですか? – NLed
これは基本的には流れですが、ここでは2つの別々の実行スレッドがあるので、wait_semaphore(Begin_Security_Check)から(WAN *からルータバッファ*へのデータダウンロードアクション)あたかも 'goto'のように、誰かがスレッド上で' Task Security_Check'を起動し、別のスレッドで 'Task Download_Data'を呼び出す必要があります。 – dsolimano
だから誰も 'Task Download_Data'を起動しなければ、コードは' wait_semaphore(Begin_Security_Check);で待ちますか? ' – NLed