1

ブーストスレッドライブラリは初めてです。1つの関数でscoped_lockを取得し、呼び出し先でそれを待機する必要がある状況があります。

コードは次の行にあります:

class HavingMutex
{
   public:
   ...
   private:
   static boost::mutex m;
   static boost::condition_variable *c;
   static void a();
   static void b();
   static void d();
}

void HavingMutex::a()
{
   boost::mutex::scoped_lock lock(m);
   ...
   b()          //Need to pass lock here. Dunno how !
}

void HavingMutex::b(lock)
{
    if (some condition)
    d(lock) // Need to pass lock here. How ?
}

void HavingMutex::d(//Need to get lock here)
{
    c->wait(lock); //Need to pass lock here (doesn't allow direct passing of mutex m)
}

基本的に、関数d()では、a()で取得したスコープロックにアクセスして、待機できるようにする必要があります。(他のスレッドが通知します)。

どんな助けもありました。ありがとう !

4

1 に答える 1

0

簡単なリファレンスを試しましたか?http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.htmlにあるboost1.41のドキュメントによると、必要なのはそれだけです。..。

     void HavingMutex::a()
     {
        boost::mutex::scoped_lock lock(m);
        ...
        b(lock);
     }

     void HavingMutex::b(boost::mutex::scoped_lock &lock)
     {
         if (some condition) // consider while (!some_condition) here
           d(lock); 
     }

     void HavingMutex::d(boost::mutex::scoped_lock &lock)
     {
         c->wait(lock);
     }

     void HavingMutex::notify()
     {
         // set_condition;
         c->notify_one();
     }

また、ブーストの例では、サイクルアラウンド待機中にあります。待機は、システム自体によって中断される場合がありますが、実際にはロックされていません。

すべてのメソッドを静的メンバーで静的にすることも再検討することをお勧めします。代わりに、それらを通常のメンバーとして作成し、1つのグローバルオブジェクトを作成します。

于 2012-08-01T07:33:30.040 に答える