我正在使用以下等待/信号方式让线程相互通知。
std::condition_variable condBiz;
std::mutex mutexBar;
..
void Foo::wait()
{
std::unique_lock<std::mutex> waitPoint(mutexBar);
if (waitPoint.owns_lock())
{
condBiz.wait(waitPoint);
}
}
void Foo::signal()
{
std::unique_lock<std::mutex> waitPoint(mutexBar);
condBiz.notify_all();
}
void Foo::safeSection(std::function<void(void)> & f)
{
std::unique_lock<std::mutex> waitPoint(mutexBar);
f();
}
然后将锁定/解锁机制从 unique_lock 转换为 lock_guard,因为我没有返回 unique_lock 以在其他地方使用(等待/信号除外),并且据说 lock_guard 的开销更少:
void Foo::safeSection(std::function<void(void)> & f)
{
std::lock_guard<std::mutex> waitPoint(mutexBar); // same mutex object
f();
}
它有效。
这适用于所有平台还是看起来适用于当前平台?unique_lock 和 lock_guard 可以使用相同的互斥对象相互工作吗?