1

我是 boost 线程库的新手。我有一种情况,我在一个函数中获得了一个 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上的 boost 1.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();
     }

同样在 boost 示例中,他们有 while 循环等待。在某些情况下,等待可能会被系统本身中断,而不是你真的得到了锁。

我建议您重新考虑将所有方法都设置为静态成员。而是将它们创建为普通成员,并创建一个全局对象。

于 2012-08-01T07:33:30.040 回答