A condition_variable
используется вместе с mutex
, что является , а не косметической функцией. Вы, кажется, под впечатлением, что
std::unique_lock<std::mutex> lock(file_monitor_mutex_);
достаточно для выполнения условия wait
; но мьютекс концептуально имеет смысл, только если он используется для взаимного исключения . Вы не используете его как таковой, мьютекс блокируется только внутри file_monitor_thread_func
, поэтому взаимное исключение при операциях изменения состояния не гарантируется.
Контрольный признак того, что вы используете монитор неправильно, заключается в том, что вы почувствовали необходимость использовать атомарные объекты, поскольку взаимное исключение (которое является обязательным условием) гарантирует, что можно использовать обычные объекты.
Просто невозможно объединить условие и атомарные объекты . Они принадлежат разным конструкциям.