Я использую С++ 11, и у меня есть std::thread
который является членом класса, и он отправляет информацию слушателям каждые 2 минуты. Другое, что он просто спит. Итак, я заставил его спать 2 минуты, затем отправьте необходимую информацию, а затем снова спать 2 минуты.
// MyClass.hpp
class MyClass {
~MyClass();
RunMyThread();
private:
std::thread my_thread;
std::atomic<bool> m_running;
}
MyClass::RunMyThread() {
my_thread = std::thread { [this, m_running] {
m_running = true;
while(m_running) {
std::this_thread::sleep_for(std::chrono::minutes(2));
SendStatusInfo(some_info);
}
}};
}
// Destructor
~MyClass::MyClass() {
m_running = false; // this wont work as the thread is sleeping. How to exit thread here?
}
Выпуск:
Проблема с этим подходом заключается в том, что я не могу выйти из потока во время сна. Насколько я понимаю, я могу разбудить его, используя std::condition_variable
и изящно выйти? Но я изо всех сил пытаюсь найти простой пример, который дает минимальный минимум, как того требует описанный выше сценарий. Все найденные condition_variable
выглядят слишком сложными для того, что я пытаюсь сделать здесь.
Вопрос:
Как я могу использовать std::condition_variable
чтобы разбудить поток и изящно выйти во время сна? Или есть ли другие способы достижения этого без техники condition_variable
?
Кроме того, я вижу, что мне нужно использовать std::mutex
в сочетании с std::condition_variable
? Это действительно необходимо? Не удается ли достичь цели, добавив логику std::condition_variable
только в требуемые места в коде здесь?
Среда:
Linux и Unix с компиляторами gcc и clang.