2012-01-04 10 views
0

これは、セマフォを使用するタスク同期のための擬似コードです。 操作には、データの転送とセキュリティチェックが必要です。私が読んでいるノートで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);です。つまり、両方とも同じですか?

私は本当に混乱しています。ステップバイステップでこの疑似コードの実行方法を説明してください。

答えて

1

当初、我々は0

の値を持つ各さて、私はこの二つのTasksを推測しているが、どういうわけか、別のスレッド上で開始され、2つのセマフォを作成 - 特に、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がそのセマフォを通知するまで一時停止させます。したがって、セキュリティチェックが完了するまで進行しません。

+0

これは、wait_semaphore(Begin_Security_Check);でコードが停止し、通知されるまでコードが次のコードに移動することを意味します。その後、 'signal_semaphore(Begin_Security_Check);にシグナルを送り、最初のループに戻り'(* actions check data *) 'を実行するまで、'(WANからルータバッファ*へのデータをダウンロードするための ' 'など..これは正しいのですか? – NLed

+0

これは基本的には流れですが、ここでは2つの別々の実行スレッドがあるので、wait_semaphore(Begin_Security_Check)から(WAN *からルータバッファ*へのデータダウンロードアクション)あたかも 'goto'のように、誰かがスレッド上で' Task Security_Check'を起動し、別のスレッドで 'Task Download_Data'を呼び出す必要があります。 – dsolimano

+0

だから誰も 'Task Download_Data'を起動しなければ、コードは' wait_semaphore(Begin_Security_Check);で待ちますか? ' – NLed

2

Security_Checkが何か起こる前にwait_semaphoreに到着した場合、それは正しいことです。しかし、Download_Dataが最初に何をしたのか(wrtセマフォ)は気付きます。それは、非常にセマフォを通知し、Security_Checkを起動します。これはまさにあなたが望む同期の種類です。

+0

また、create_semaphore()を呼び出すたびに新しいセマフォが作成されるため、2つは同じではありません。 –

+0

情報ありがとうございました:) – NLed

関連する問題