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;
Обсуждают сегодня