1

win32 API のみを使用して同じスレッド プロシージャを実行する複数のワーカー スレッドを制御するベスト プラクティスは何ですか?

私は多くの代替案を試しましたが、うまくいきません。私の現在のコードは次のようになります。

// thread proc
DWORD WINAPI thread_proc(LPVOID param) {
    while(1) {
        WaitForSingleObject(start_event, INFINITE);

        // Do some work HERE
        // Work finished, go back to waiting for new work
    }
}

// main proc
int main(void) {
    // create enough worker threads
    CreateThread(... thread_proc...);
    CreateThread(... thread_proc...);
    ...

    // Wait for work here

    // start work by raising event
    SetEvent(start_event);
    ResetEvent(start_event);

基本的に、イベントを使用して複数の作業スレッドを開始していますが、もちろんこれは期待どおりに機能しません。メイン スレッドが SetEvent() と ResetEvent() の間で中断された場合、ワーカー スレッドは while ループでスピンします。一方、自動リセット イベント オブジェクトを使用すると、待機中のスレッドが 1 つだけ解放されます。

また、すべてのスレッドが終了するまでメインスレッドが待機する必要があります。いくつかの異なるアプローチにうんざりしましたが、それを機能させることができませんでした。マルチスレッド プログラミングの難しさを認識し始めたところだと思います。

編集:文法

4

2 に答える 2

0

これは本当に悪い考えです:

1)あなたが発見したように、スレッドのマイクロ管理は非常に難しく、エラーが発生しやすいです。それをしないのは、それを回避する方法です。

2) 作業スレッドが終了するのを GUI スレッドで待機する (または、実際には何かを待機する) のは、単に悪いことです。作業スレッドが完了したときに GUI スレッドに通知する。PostMessage()ing で、問題ありません。

OK、同じスレッド プロシージャを実行するワーク スレッドが複数あります。それらは同じコードを実行するため、明らかに異なるデータを操作します。スレッドが操作するデータの詳細を教えてください。タスク オブジェクト/構造体をスレッドのプールにキューイングすることになると思われますが、詳細が必要です。

マルチスレッド プログラミングはそれほど難しいものではありません - 違いがあるだけです :) 最も重要な詳細 - コード (または、理想的には任意のスレッド インスタンス) とは関係ありません。データをどのように管理するか、つまりデータをどのように分割し、どのように移動するかがすべてです。その周り。悲しいことに、それはまた、ネット上にあふれている、どうすればいいのか、スレッド化の本当に貧弱な例を避けることでもあります :(

于 2012-05-04T21:39:54.563 に答える
0

ワーカー スレッドは低い (より低い) 優先度に設定できます (GUI (メイン) スレッドは通常の優先度です)。(メイン スレッドで操作を実行しない限り) 実際には速度が低下することはなく (メイン スレッドをビジー状態に保つ操作を実行しない限り)、アプリケーションはユーザー入力に対してより応答性が高くなります。また、thread_proc() では、「作業が見つからない」場合、ワーカー スレッドが何らかの方法で譲歩する可能性があります。たとえば、1 秒ほど待機 (スリープ) します。

別の方法として、APC を使用することもできます。

于 2012-05-08T15:43:01.100 に答える