【问题标题】:condition_variable, mutex and flag in one struct一个结构中的条件变量、互斥体和标志
【发布时间】: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;
}

我希望这是一个正确的实现。

【问题讨论】:

  • boolstd::atmoic&lt;bool&gt; 有不同的语义,你必须展示你打算如何使用它
  • 你最大的风险是你公开了互斥锁——这意味着任何人和他们的狗都可以锁定它......这会让你面临死锁的风险;将互斥锁和条件变量放在一起似乎非常合理
  • "我不打算修改结构本身,只修改它的字段。"修改一个结构就是修改它的成员,因此不清楚你的意思是什么
  • 如果flag 的所有使用都将受到互斥锁的保护,那么bool 就可以了,因为互斥锁锁定和解锁强制执行正确的内存排序。否则……正如 PasserBy 所说,需要确切的例子来说明。
  • @tobi303 我的意思是我会修改结构的内部字段,但不会重新分配结构实例。我的意思是,在我看来,没有必要创建互斥锁来保护结构实例。

标签: c++ multithreading c++11 struct synchronization


【解决方案1】:

是否可以将所有三个变量组合到一个结构中?

是的。

这种方法是否存在任何隐藏的同步问题?

结构定义未描述或强制执行其预期用途。由于所有成员都可以公开访问,因此没有任何东西可以防止错误或意外使用。

更安全的定义是将其设为class,没有公共数据成员但有公共成员函数。

顺便问一下,在处理std::condition_variable的标志时,我应该使用bool还是std::atomic&lt;bool&gt;

bool 就足够了,只要访问 bool 仅在互斥锁被锁定时发生。您可以通过将其设为没有公共数据成员的类来强制执行此操作。

请注意,如果您将其设为std::atomic&lt;bool&gt; 并对其进行修改并向条件变量发出信号而不锁定互斥锁,则会导致竞争条件导致来自条件变量的通知丢失,例如:

Thread 1             |  Thread 2
                     |  check the bool
modify the bool      |
signal the condition |  <notification not received>
                     |  wait on the codition

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2015-10-18
    • 2010-11-06
    • 2015-11-17
    相关资源
    最近更新 更多