Это отдельный вопрос, но связанный с предыдущим вопросом, который я задал здесь
Я использую 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
в false, чтобы она вышла из цикла while в lambda block
.
StopMyThread() {
thread_running = false;
the_thread.join();
}
Насколько я понимаю, я могу приостановить и возобновить поток, используя std::condition_variable
, как указано здесь в моем предыдущем вопросе.
Но есть ли недостаток, если я просто использую std::atomic<bool>
thread_running
для выполнения или не выполнения логики в GetData()
, как показано ниже?
GetData() {
if (thread_running == false)
return;
//Some heavy logic
}
Сожжет ли это больше циклов ЦП по сравнению с подходом с использованием std::condition_variable
, как описано здесь ?
the_thread.join();
, которое стоит сразу послеthread_running=false
. Я думаю, что установкаthread_running
наfalse
приводит к выходу из циклаwhile
потока, за которым также следует выход из потока. Чему служит.join
в этом случае? Особенно, когда поток использует loop. - person Nawaz   schedule 11.11.2016join
необходим, потому что OP не отсоединил поток. Если он не присоединит мертвый поток обратно к основному потоку, произойдет утечка ресурсов основного потока (как правило, в конечном итоге приводит к сбою приложения). - person Mark B   schedule 11.11.2016the_thread.join()
требуется от основного потока, чтобы дождаться остановки рабочего потока, что является выходом из циклаGetData()
. Если я не сделаю.join
, то столкнусь с неопределенными сбоями приложения. следовательно, всегда хорошо иметь, даже если это не обязательно. Но мой вопрос в другом, как вы видите. Меня не беспокоит.join
- person TheWaterProgrammer   schedule 11.11.2016.join
. Я думал, что он только блокирует вызов, пока поток не завершится. Даже cppreference не упоминает то, что вы сказали об утечке ресурсов и сбое! - person Nawaz   schedule 11.11.2016