std::atomic<bool> locked;
public:
Mutex(boost::asio::io_context& io_context) :
condition(io_context, std::chrono::seconds(60)),
locked(false) {}
boost::asio::awaitable<void> lock() {
while (true) {
if(!this->locked.exchange(true)) {
co_return;
}
try {
co_await this->condition.async_wait(boost::asio::use_awaitable);
} catch (std::exception){}
}
}
boost::asio::awaitable<void> unlock() {
this->locked = false;
this->condition.cancel_one();
co_return;
}
};
Почему в таком коде иногда происходят дедлоки?
Так вот же сценарий, вроде https://t.me/supapro/1327960
Я как-то не совсем понимаю, как чинить такое(
из тупого обсервер
В 1 куске сразу и asio, и conditional, и chrono, и atomic... Неплохо) Ну, вместо std::atomic<bool> как минимум можете попробовать std::atomic_flag, который всегда lock-free
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Обсуждают сегодня