Это отдельный вопрос, но связанный с предыдущим вопросом, я спросил hereПодхода с использованием зОго :: атомными по сравнению с станд :: condition_variable WRT паузы и возобновлять зЬй :: нитки в C++
Я использую std::thread
в моем C++
код для постоянного опроса для некоторых данных & добавьте его в буфер. Я использую C++ lambda
, чтобы начать нить так:
StartMyThread() {
thread_running = true;
the_thread = std::thread { [this] {
while(thread_running) {
GetData();
}
}};
}
thread_running
является atomic<bool>
объявленными в заголовке класса. Вот моя GetData
функция:
GetData() {
//Some heavy logic
}
Далее я также StopMyThread
функцию, где я поставил thread_running
ложь так, что он выходит из цикла в то время как в lambda block
.
StopMyThread() {
thread_running = false;
the_thread.join();
}
Как я понимаю, я могу приостановить & резюме нить с помощью std::condition_variable
как указывалось here в моем предыдущем вопросе.
Но есть недостаток, если я просто использовать std::atomic<bool>
thread_running
выполнить или не выполнить логику в GetData()
, как показано ниже?
GetData() {
if (thread_running == false)
return;
//Some heavy logic
}
Будет ли это сжигать больше циклов процессора по сравнению с подходом с использованием std::condition_variable
, как описаноhere?
Честно говоря, я не понимаю 'the_thread.join();' который сразу после 'thread_running = false'. Я думаю, что установка 'thread_running' в' false', делает поток 'while' цикла потока завершенным, а затем выходит из потока. Что означает «.join» в этом случае? Особенно, когда поток использует * loop *. – Nawaz
@Nawaz Вызов 'join' необходим, потому что OP не отсоединяет нить. Если он не присоединяется к мертвому потоку обратно в основную нить, основной ресурс (ы) потока будет протекать (как правило, в конечном итоге сбой приложения). –
@Nawaz 'the_thread.join()' требуется из основного потока для ожидания остановки рабочего потока, который выходит из цикла GetData(). Если я не делаю '.join', тогда я сталкиваюсь с неопределенными сбоями приложений. поэтому всегда хорошо иметь хотя бы не полностью обязательный характер. Но мой вопрос здесь различен, как вы видите. Меня не беспокоит '.join' –