-3

このコードを確認してください。ここには何も問題はないと信じています。

あなたは特にかもしれません。テンプレートが使用されているクラスの dequeue 関数を見てみたい。

void enqueue(const T &data)
    {
        _mutex.lock();
        _queue.push(data);
        _mutex.unlock();
    }

T const& dequeue()
    {
        _mutex.lock();
        T &data = _queue.back();
        _queue.pop();
        _mutex.unlock();

        return data;
    }
4

2 に答える 2

3

dequeue、ぶら下がっている参照を返します。オブジェクトをpopペッドすると、そのオブジェクトは存在しなくなります。

于 2011-06-21T17:07:50.540 に答える
1

いいえ。

まず、ミューテックスを叩いてスレッドセーフと呼ぶことはできません。これは、不要な場合に恐ろしいオーバーヘッドを生成するだけでなく、特定の操作のアトミック性を損なうことになります。たとえば、キュ​​ーのサイズをチェックして、それがゼロ、キューから1つを削除します-その間に誰かがそれを空にした可能性があるためです。または、オブジェクトを外して、ポップされた場合はどうなりますか?おっと。

スレッドセーフは、データ構造にミューテックスをチャックして完了と呼ぶだけでなく、データに同時にアクセスしないことです。

第二に、並行コンテナーを構築しようとしている場合、それらは存在し、それらが必要である場合、完全に異なるインターフェースがあります。IntelのTBBとMicrosoftのPPLの同時データ構造を見てください。それらは、同時使用のために設計されたインターフェースを備えており、slap-a-mutex-on-itハックよりも高速でバグが大幅に少なくなります。

于 2011-06-21T17:10:16.493 に答える