2011-11-11 105 views
0

ミューテックスに関して、どちらの使用法が優れているのだろうかと思っていました。私の心に来た2用法は次のとおりです。要するにQMutexLockerとQMutexのどちらを使うのが良いですか?

1)

Qlist getList() 
    { 
     QMutexLocker locker(&m_mutex); 
     return m_list; 

    } 

    for (int i =0 ;i < getList.count ; i++) 
    { 
      obj = getList.at(i) 
      //some work 
      // on obj    
    } 

2)

Qlist getList() 
    { 
     return m_list; 

    } 

    { 
    QMutexLocker locker(&m_mutex); 
    for (int i =0 ;i < getList.count ; i++) 
    { 
      obj = getList.at(i)<br> 
      //some work 
      // on obj     
    } 
    } 

、それが使用されているか、それがどこリストを保護することをお勧めしますリストが返されているところからgetlist関数にmutexを入れてもよろしいですか?

+2

getListの外側にあるコードブロックは何ですか?同じクラスの他のメソッドは何ですか?また:Horridフォーマット。 – themel

答えて

1

ロックとロック解除はコストのかかる操作ですが、リソースを長期間ロックすると、他のスレッドが作業を続行できなくなる可能性があります。

"objでの作業"に時間がかかり過ぎると、SomeFuntion()がロックされ、そうでない場合はforループの外側にロックされます。

私はまた、設計をきれいにしておきます。つまり、forループを持つ部分がmutexを認識してはならない場合(例えば別のクラスにある場合)、私はSomeFunctionに関係なくSomeFunctionをロックします。操作の長さ、または私はミューテックスを別の場所に移動します。 もちろん、どのメソッドがスレッドセーフであり、どのメソッドがスレッドセーフではないかを覚えておいてください。

PS:あなたが投稿コードから、それは2つのブロックが同じクラスにいるかいない

3

あなたがゲッターでmutexをロックする理由私は理解していない場合は理解することが非常に困難です。あなたが達成しているのは、QListの浅いコピーが作成されている間、他の保護されたセクションが実行されないようにすることです。

QListの操作を実行している間に、QListへの他のアクセスから隔離して実行する必要がある場合は、ミューテックスをロックする必要があります。ループの中のQListで行う作業の性質と、他のスレッドが同時にそれとやり取りしている可能性があるため、ロックする必要があるかどうかが決まります。

ループ中に要素の数を変更できるスレッドがない場合は、各要素で行う作業の周りのループ本体内でのみロックするのが安全です(他のスレッドが内容QList)、それ以外の場合はループ本体の外側にロックします。ゲッターの中でロックするだけで何もできません。

関連する問題