2011-08-15 5 views
10

私はBoostを使用し始めましたが、Win32のクリティカルセクションまたは.Netのlockの動作を再現するコードを実装する方法を理解できません。Boostでクリティカルセクションを作成するにはどうすればよいですか?

共有フィールドへの書き込み操作を制御するために異なるスレッドから呼び出すことができるメソッドFooを書きたいと思います。同じスレッド内の再帰呼び出しを許可する必要があります(Foo() - > Foo())。 C#ので

この実装は非常に簡単です:あなたはブーストを使用することができますブースト

object _synch = new object(); 
void Foo() 
{ 
    lock (_synch) // one thread can't be lock by him self, but another threads must wait untill 
    { 
     // do some works 
     if (...) 
     { 
      Foo(); 
     } 
    } 
} 

答えて

11

:: lock_guard <>クラス:

class test 
{ 
public: 
void testMethod() 
{ 
    // this section is not locked 
    { 
    boost::lock_guard<boost::recursive_mutex> lock(m_guard); 
    // this section is locked 
    } 
    // this section is not locked 
} 
private: 
    boost::recursive_mutex m_guard; 
}; 

PS Boost.Threadライブラリにこれらのクラス。

+1

あなたのお勧めは非常に便利です。私はエラーを修正しましたが、パフォーマンスの抑制があります! 3回以上! =((修正前はunique_lock を使用しました) – Vie

+1

共有リソースを使用している場所でコードサンプルを提供できますか?http://home.roadrunner.com/~hinnant/mutexes/locking.html#Sharedもチェックしてください。 –

+1

再帰的なロックを避けるようにしてください。ガードを外側のスコープに移動してもかまいません。再帰的なmutexは単純なものよりも遅くなる可能性があります。 – blaze

3

Boost.Threadを使って例を書き直しました。私はコメントを削除しましたが、それ以外の場合は1対1の書き換えでなければなりません。

boost::recursive_mutex mtx; 

void Foo() 
{ 
    boost::lock_guard<boost::recursive_mutex> lock(mtx); 
    if (...) 
    { 
     Foo(); 
    } 
} 

ドキュメントはhereです。

Boostには、いくつかの異なるミューテックスタイプが定義されています。あなたの例では、ロックが再帰的に行われていることが示されているため、少なくともboost::recursive_mutexを使用する必要があります。

また、さまざまな種類のロックがあります。特に、複数のリーダーが同時にロックを保持できるように、リーダーライターのロックが必要な場合は、lock_guardの代わりにboost::shared_lockを使用できます。

関連する問題