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;
} ;
在这里你可以从不同的线程向列表中推送和弹出数据(并实现典型的生产者-消费者方案)
我正在做一个设计,试图找出如何在多线程应用程序中使用条件变量。我的情况如下所述:
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;
} ;
在这里你可以从不同的线程向列表中推送和弹出数据(并实现典型的生产者-消费者方案)