C ++条件变量范围

时间:2015-06-06 03:43:02

标签: c++ multithreading boost-thread

我正在设计并试图弄清楚如何在多线程应用程序中使用条件变量。我的情况如下所述:

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的类范围内的线程。在代码中,您必须注意每个类中的条件变量具有完全相同的名称。但我的问题是C ++语言是否将条件变量的使用限制在声明它的范围内,即在类中。如果这样可行,这段代码中的设计优势是每个类MyClass1和MyClass2可以在单独的线程中运行,并且当调用每个类的相应唤醒函数时,只会运行运行该特定类的myfunc的线程,这可能非常在多线程应用程序中很有用。

1 个答案:

答案 0 :(得分:0)

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

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;
} ;

在这里,您可以从不同的线程将数据推送到列表中(并实现典型的生产者 - 消费者方案)