我正在设计并试图弄清楚如何在多线程应用程序中使用条件变量。我的情况如下所述:
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的线程,这可能非常在多线程应用程序中很有用。
答案 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;
} ;
在这里,您可以从不同的线程将数据推送到列表中(并实现典型的生产者 - 消费者方案)