2011-06-21 20 views
-2

このコードを確認してください。私はここに何も間違っていると信じています。getterメソッドのconst参照

テンプレートが使われるクラスのデキュー機能を見るのが好きです。

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; 
    } 
+1

この宿題はありますか?正確に何が助けを必要としますか? –

+2

あなたの_question_はどこですか? – dave

+1

なぜあなたは何か間違っていると思いますか?あるいは、一般的なコードレビューをしたいですか?もしそうなら、codereview.stackexchange.comに行きます。ここでは、この抽出に十分な文脈がないと聞かれます。 –

答えて

3

dequeueには、ダングリングリファレンスが返されます。 popが オブジェクトをペダルにすると、そのオブジェクトは存在しなくなります。

1

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

スレッドセーフはでデータに同時にアクセスしません。は、データ構造にミューテックスをチャッキングして呼び出すだけではありません。

第2に、のコンカレントコンテナを構築しようとしている場合は存在し、それらは必要です。インテルのTBBとMicrosoftのPPLの同時データ構造を見てください。彼らはあなたのslap-a-mutex-on-itハッキングよりもずっと速く、かなり少ないバグになる同時使用用に設計されたインターフェースを持っています。

+0

私はあなたに同意します。しかし、この実装は、実際には、pthreadを使っていくつかの同期処理を提供するstl :: queueのラッパーです。それは簡単な理解の要件になります。 – Faisal