2012-05-01 6 views
0

私は1つのミューテックス、2つのスレッド、1つの関数、1つのサイクル(擬似コード)を持っているとしましょう。 機能:セマフォ(ミューテックス)のトラブル

void Update(){ 
    Mutex.enter(); 
    ...// time: 10 ms 
    Mutex.leave(); 
} 

MAIN.CPP:

void main(){ 
    ...// Starting thread 
    while(true) 
     Update(); 
} 

スレッド:

void Thread(void *){ 
    Mutex.enter(); 
    ... // 
    Mutex.leave(); 
} 

しかし、ミューテックス小さな時間が自由になるよう機能は、常に呼び出します。どのくらいの確率でスレッドがミューテックスに入る必要がありますか?低い場合、どのように解決することができますか?

+0

おそらく、更新呼び出しの間にプロセッサを明示的に生成しますか?例えば、 'pthread_yield()'関数があります – Kevin

+4

継続的な呼び出しを排除するデータ/コード用の他のデザインを見つけるのは非常に難しいです。収量()は弾丸の絆創膏です。それはちょっと助けるかもしれませんが、すぐに手術が必要になります。 –

+0

スレッドがMutex.enterを呼び出すとブロックされ、他のスレッドの呼び出しが終了するとすぐにスレッドはその時点で唯一のスレッドであるため、スレッドを要求します。 – jcoder

答えて

2

ブーストスレッド(link)を使用している場合は、yield()を使用します。これは、他の「待機中の」スレッドが「チャンスを得る」ことを可能にします。

おそらくこれを行うwin32またはpthreadsの方法があります。

編集:そして、ところで、yield()外側には、ロックのを使用します。それがロックの内側にあるなら、明らかにそれは役に立たないでしょう。

EDIT2:

  • のWin32::SwitchToThread()msdn link、こことは、異なるプラットフォームのための機能です。
  • のLinux/Unixののpthread: `pthread_yield()」link

あなたはこれらのプラットフォームのいずれかでない場合、これらのリンクにある説明を読んで、そしてあなたに同じことを行う関数を探してフレームワーク。

+0

いいえ、私はブーストや他のライブラリを使用していません。 –

+0

収量は実際に何が行われる必要があり、概念はブーストに限定されない。どのスレッドライブラリを使用していても関数がなければなりません。 pthread_yieldのように – UmNyobe

+0

あなたは何を使っていますか? win32?ユニックスpthreads?ご使用のコンパイラ/環境に関する情報をお知らせください。 –

0

あなたが示した疑似コードから、スレッド間の協調がないようです。最初のUpdate()への呼び出しが置かれる前にthread2がmutexを取得するのが幸運であれば、thread2 Update()の全ライフタイムの間、関数は呼び出されません。それは私に欠陥のあるデザインのように見えます。もしthread2が作業をしていて、 'main'スレッドがUpdate()関数を呼び出してthread2スレッドルーチンで何が起きているのかを監視して報告しているのであれば、thread1(主なもの) update_requiredシグナルとthread2(作業中に進行中のスレッド)が作業を行い、進行状況を報告するために必要なすべてのデータをstruct変数に入力し、スレッド1にデータを使用して進捗状況を報告させます。このような構造体変数のリングバッファを使用すると、ミューテックスの必要がなくなります。

関連する問題