3

C++11 と stl スレッドを使用して、スレッド セーフなキューを作成しています。現在、WaitAndPop メソッドは次のようになっています。呼び出し元のスレッドが停止するように求められているかどうかを示す何かを WaitAndPop に渡すことができるようにしたいと考えています。WaitAndPop は、待機してキューの要素を返した場合は true を返す必要があり、呼び出しスレッドが停止している場合は false を返す必要があります。

    bool WaitAndPop(T& value, std::condition_variable callingThreadStopRequested)
    {
        std::unique_lock<std::mutex> lock(mutex);
        while( queuedTasks.empty() )
        {
            queuedTasksCondition.wait(lock);
        }

        value = queue.front();
        queue.pop_front();
        return true;
    }

このようなコーディングは可能ですか?私は Win32 WaitForMultipleObjects に慣れていますが、この場合に有効な代替手段が見つかりません。

ありがとう。

この関連する質問を見たことがありますが、実際には問題に答えませんでした。Linux でのスレッドの学習

4

1 に答える 1

9

あなたの問題を正しく理解していれば、おそらく次のようなことをするでしょう:

 bool WaitAndPop(T& value)
 {
    std::unique_lock<std::mutex> lk(mutex);            

    // Wait until the queue won't be empty OR stop is signaled
    condition.wait(lk, [&] ()
    {
        return (stop || !(myQueue.empty()));
    });

    // Stop was signaled, let's return false
    if (stop) { return false; }

    // An item was pushed into the queue, let's pop it and return true
    value = myQueue.front();
    myQueue.pop_front();

    return true;
}

ここではandstopのようなグローバル変数です(標準コンテナ アダプタの名前でもあるため、変数名として使用しないことをお勧めします)。制御スレッドは( へのロックを保持しながら) に設定し、またはを呼び出すことができます。conditionmyQueuequeuestoptruemutexnotifyOne()notifyAll()condition

このように、条件変数は、新しいアイテムがキュープッシュされたときとシグナルが発生したときの両方notify***()で呼び出されます。つまり、その条件変数で待機した後にウェイクアップしたスレッドは、どのような理由でウェイクアップされたかを確認する必要があります。そしてそれに応じて行動します。stop

于 2013-03-28T18:07:52.817 に答える