gpt4 book ai didi

c++ - 一个结构中的条件变量、互斥锁和标志

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:24 25 4
gpt4 key购买 nike

可以将所有三个变量合并到一个结构中吗?

struct lock_struct
{
std::mutex mutex;
std::conditional_variable cv;
bool flag;
};

这种方法是否存在任何隐藏的同步问题?我不打算修改结构本身,只修改它的字段。

顺便问一下,我应该使用bool吗?或 std::atomic<bool>在处理 std::condition_variable 时的旗帜?

编辑:根据答案实现。

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;
}

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

最佳答案

Is to ok to combine all three variables into one struct?

是的。

Are there any hidden synchronization problems with this approach?

结构定义不描述或强制其预期用途。由于所有成员都可以公开访问,因此没有什么可以防止不正确或意外使用。

一个更安全的定义是让它成为class没有公共(public)数据成员,但有公共(public)成员函数。

By the way, should I use bool or std::atomic<bool> when dealing with std::condition_variable's flag

bool只要访问 bool 就足够了只有当互斥量被锁定时才会发生。您可以通过使其成为没有公共(public)数据成员的类来强制执行此操作。

注意如果你做到了std::atomic<bool>并修改它并在不锁定互斥锁的情况下向条件变量发出信号,这会导致竞争条件,从而导致来自条件变量的通知丢失,例如:

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

关于c++ - 一个结构中的条件变量、互斥锁和标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com