C++ 条件变量作用域

C++ condition variable scope

我正在做一个设计,试图找出如何在多线程应用程序中使用条件变量。我的情况如下所述:

class MyClass1
{
  boost::mutex mut;
  boost::condition_variable var;

  public:

  void myfunc1()
  {
    boost::scoped_lock mylock(mut);

   //Wait untill notification is invoked
    var.wait(lock);

    //Continue processing after waking up
  }

  void wakeupClass1()
  {
    //Call notify to wake up only myfunc1
    var.notify_one();
  }
};

class MyClass2
{
  boost::mutex mut;
  boost::condition_variable var;

  public:

  void myfunc2()
  {
    boost::scoped_lock mylock(mut);

    //Wait untill notification is invoked
    var.wait(lock);

    //Continue processing after waking up
  }

  void wakeupClass2()
  {
    //Call notify to wake up only myfunc2
    var.notify_one();
  }
};

我的问题是在wakeupclass1()中调用notifyone()时,会唤醒MyClass2中的条件变量还是仅限于唤醒线程在 Class1 的 class 范围内声明了第一个条件变量。在代码中,您必须注意每个 class 中的条件变量具有完全相同的名称。但我的问题是 C++ 语言是否将条件变量的使用限制在声明它的范围内,即在 class 内。如果可行,这段代码的设计优势是每个 Class MyClass1 和 MyClass2 可以 运行 在单独的线程中,当每个 class 对应的唤醒函数被调用,只有线程 运行ning 特定 class 的 myfunc 将被执行,这在多线程应用程序中非常有用。

除了您声明一个名为 mylock 的 scoped_lock 然后使用 lock(我假设您再次指的是 mylock)这一事实之外,还有另一点:您有 lock 变量的不同实例。当您通知变量时,解锁的是等待 same 变量的线程。典型的情况是这样的:

template <class T>
class shared_list
{
public:
  void pack(cont T &t)
  {
     boost::scoped_lock lock(mut) ;
     data.push_back(t) ;
     condition.notify_one() ;
  }
  T pop(void)
  {
     boost::scoped_lock lock(mut) ;
     do 
     {  condition.wait(lock) ;} while (data.empty() ;}
     T result = *data.begin() ;
     daa.pop_front() ;
     return result ;
  }
private:
  std::list<T> data ;
  boost::mutex mut;
  boost::condition_variable var;
} ;

在这里你可以从不同的线程向列表中推送和弹出数据(并实现典型的生产者-消费者方案)