0

今私は立ち往生しています、ここに私がやろうとしていることがあります:

  • 3 つのスレッドを作成します。
  • これら 3 つのスレッドは、共有グローバル リソース (ベクトル) にアクセスします。

関数の特定のポイント (すべてのスレッドが呼び出す) で、スレッドをスリープ状態にする Sleep(time) 関数があり、関数は戻りません。これは、別のスレッド-スレッド2が関数にアクセスして使用し、スリープするまでグローバル変数を変更して、スレッド3が関数にアクセスできるようにする場所です...

グローバル変数にアクセスする「クリティカル セクション」関数のアクセス時間は特定されておらず、決して同じではありません。

最初に、メインで呼び出します

    InitializeCriticalSection(&m_stCriticalSection);

私が試みたのは、この関数が呼び出されると、すぐに呼び出すことでした

EnterCriticalSection(&m_stCriticalSection);

次に、グローバル変数などを変更し、Sleep(time) を呼び出す前に

        LeaveCriticalSection(&m_stCriticalSection);         

これの問題は、他のスレッドが関数を離れても、関数にアクセスできないことです。他のスレッドが継続的に、または 5 秒ごとにクリティカル セクションにアクセスする方法はありますか? 私の実装はもっと良いでしょうか?

だからここに私が今持っているものがあります

void function() // all our threads will access this
{
   EnterCriticalSection(&obj)
   // manipulate global data
   LeaveCriticalSection(&obj)
   Sleep(long time) // another thread SHOULD NOW have access to this section!
   return true;
}
4

2 に答える 2

0

「EnterCriticalSection() の後、LeaveCriticalSection() の前に何らかの例外が発生し、LeaveCriticalSection() が実際に発生しないようにする」などの状況に役立つスコープ付きヘルパーを使用する方がエラーが発生しやすいと思います。

いくつかのトレースを使用して、CS の周りにラッパー (上記を参照) を実行できます。

また、アプリケーション ダンプを収集し、WinDbg を介して現在のスレッド状態と cs 状態を確認するのは簡単だと思います。

于 2016-06-03T12:35:08.653 に答える