【发布时间】:2018-05-17 18:50:23
【问题描述】:
是否可以将所有三个变量组合到一个结构中?
struct lock_struct
{
std::mutex mutex;
std::conditional_variable cv;
bool flag;
};
这种方法是否存在任何隐藏的同步问题? 我不打算修改结构本身,只修改它的字段。
对了,在处理std::condition_variable的flag时我应该使用bool还是std::atomic<bool>?
编辑:根据答案实施。
class ConditionLock
{
public:
void wait();
void notify();
bool getFlag() const;
private:
mutable std::mutex _mutex;
std::condition_variable _cv;
bool flag;
};
void ConditionLock::wait()
{
std::unique_lock<std::mutex> lock(_mutex);
_cv.wait(lock, [&] { return flag; });
}
void ConditionLock::notify()
{
std::unique_lock<std::mutex> lock(_mutex);
flag = true;
lock.unlock();
_cv.notify_all();
}
bool ConditionLock::getFlag() const
{
std::lock_guard<std::mutex> lock(_mutex);
return flag;
}
我希望这是一个正确的实现。
【问题讨论】:
-
bool和std::atmoic<bool>有不同的语义,你必须展示你打算如何使用它 -
你最大的风险是你公开了互斥锁——这意味着任何人和他们的狗都可以锁定它......这会让你面临死锁的风险;将互斥锁和条件变量放在一起似乎非常合理
-
"我不打算修改结构本身,只修改它的字段。"修改一个结构就是修改它的成员,因此不清楚你的意思是什么
-
如果
flag的所有使用都将受到互斥锁的保护,那么bool就可以了,因为互斥锁锁定和解锁强制执行正确的内存排序。否则……正如 PasserBy 所说,需要确切的例子来说明。 -
@tobi303 我的意思是我会修改结构的内部字段,但不会重新分配结构实例。我的意思是,在我看来,没有必要创建互斥锁来保护结构实例。
标签: c++ multithreading c++11 struct synchronization