std::thread m_worker;
std::atomic<bool> m_stop{false};
...
void foo() {
if (m_worker.joinable()) {
m_stop = true;
m_worker.join();
}
m_stop = false;
m_worker = std::thread([&](){
while (!m_stop) {
// do work
}
};
}
Лайфтаймы проверил, там всё норм
Да вроде нет, если это всё в одном потоке выполняется
А насколько законно в данном случае брать в потоковую лямбду всё по ссылке? (это отдельный вопрос, если что)
я за лайфтаймы отвечаю, мне норм
Так напрямую UB. Доступ к m_stop надо синхронизировать
норм в ограниченном кол-ве случаев. В общем случае не норм
Тогда ок
Тут и правда может быть UB У тебя сначала может выполниться условие, потом может выставиться m_stop = true, а уже потом выполнится тело цикла
я выяснил что проблема в винапи, если там и уб то оно на поведение не влияет
вроде как у атомиков по дефолту memor_order_seq_cst, т.е компиль не должен ничего переупорядочивать между операциями
void store( T desired, std::memory_order order = std::memory_order_seq_cst ) noexcept;
Обсуждают сегодня