Правильность этого кода зависит от многих вещей.Больше всего это зависит от того, что именно вы подразумеваете под «правильным».Насколько я могу судить, биты кода, которые вы показываете, не вызывают неопределенного поведения (при условии, что ваши work_thread
и cancel_requested
на самом деле не инициализируются в порядке, предложенном вашим фрагментом выше, так как вы могли бы получить поток, потенциально читающийнеинициализированное значение атома).Если все, что вам нужно сделать, это изменить значение этого флага и заставить поток в конечном итоге увидеть новое значение в какой-то момент независимо от того, что еще может происходить, тогда достаточно std::memory_order_relaxed
.
Однако яубедитесь, что ваш рабочий поток вызывает функцию process_next_element()
.Это говорит о том, что существует некоторый механизм, посредством которого рабочий поток получает элементы для обработки.Я не вижу выхода из потока, когда все элементы были обработаны.Что делает process_next_element()
, когда рядом нет следующего доступного элемента?Он просто сразу возвращается?В этом случае вы ждете больше ввода или отмены, что сработает, но, вероятно, не идеально.Или process_next_element()
внутренне вызывает некоторую функцию, которая блокирует, пока элемент не станет доступным !?Если это так, то для отмены потока потребуется сначала установить флаг отмены, а затем сделать все необходимое, чтобы убедиться, что следующий вызов элемента ваш поток потенциально блокирует при возврате.В этом случае потенциально важно, чтобы поток никогда не видел флаг отмены после возврата блокирующего вызова.В противном случае вы могли бы получить возврат вызова, вернуться в цикл, все еще прочитать старый флаг отмены и затем снова вызвать process_next_element()
.Если process_next_element()
гарантированно просто вернется снова, то все в порядке.Если это не так, у вас тупик.Поэтому я считаю, что технически это зависит от того, что именно делает process_next_element()
.Один может представить себе реализацию process_next_element()
, где вам потенциально потребуется больше, чем просто порядок памяти.Однако, если у вас уже есть механизм извлечения новых элементов для обработки, зачем вообще использовать отдельный флаг отмены?Вы можете просто обработать отмену с помощью того же механизма, например, заставить его вернуть следующий элемент со специальным значением или вообще не возвращать элемент, чтобы сигнализировать об отмене обработки и заставить поток вернуться вместо использования отдельного флага ...