0

たとえば、Mutexが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();
}

ただし、Functionは常に呼び出しを行うため、Mutexの短い時間は無料です。スレッドがMutexに入る可能性はどのくらいありますか?低い場合、どのように解決できますか?

4

2 に答える 2

2

ブーストスレッド(リンク)を使用している場合は、を使用しますyield()。これにより、他の「待機中」のスレッドが「チャンスを得る」ことができるようになります。

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

編集:そして、ちなみに、ロックのyield() 外側を使用してください。それが錠の中にあるなら、明らかにそれは役に立たないでしょう。

Edit2:さまざまなプラットフォームの機能は次のとおりです。

これらのプラットフォームを使用していない場合は、これらのリンクの説明を読み、フレームワークで同じことを行う関数を探してください。

于 2012-05-01T15:15:45.860 に答える
0

あなたが示した疑似コードから、スレッド間の連携はないようです。最初の Update() の呼び出しが行われる前にスレッド 2 がミューテックスを取得できた場合、スレッド 2 の存続期間全体にわたって Update() 関数は呼び出されません。私には欠陥のある設計のように見えます。スレッド 2 が作業を行っており、「メイン」スレッドが Update() 関数を呼び出して、スレッド 2 スレッド ルーチンで起こっていることの進行状況を監視および報告している場合、スレッド 1 (メイン スレッド) を待機させる方がはるかに理にかなっています。 update_required シグナルと thread2 (作業が進行中のもの) が作業を行い、次に、進行状況を報告するために必要なすべてのデータを構造体変数に入力し、データを使用して進行状況を報告するように thread1 に信号を送ります。

于 2012-05-02T13:34:50.287 に答える