Is it possible to combine all three variables into one structure?
struct lock_struct
{
std::mutex mutex;
std::conditional_variable cv;
bool flag;
};
Are there any hidden synchronization issues with this approach? I do not intend to change the structure myself, only its fields.
By the way, should I use boolor std::atomic<bool>when working with a flag std::condition_variable?
Edit: implemented based on responses.
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;
}
I hope this is the correct implementation.
source
share