Часто спрашивают и отвечают:
В общем, одновременное использование отдельных объектов безопасно, но небезопасно для одновременного использования одного объекта. Однако такие типы, как io_context, обеспечивают более надежную гарантию того, что можно безопасно использовать один объект одновременно.
Итак, да, вам нужно защитить активный доступ к вашим объектам таймера / сокета. Однако наличие асинхронных операций в полете не является проблемой: речь идет о ваших доступах, требующих вашей синхронизации.
Итак,
asio::post(strand, [&sock] { sock.shutdown();});
всегда безопасно, а когда у вас есть только 1 поток, выполняющий службу, тогда
post(io_context_, [&sock] { sock.shutdown();});
тоже подойдет. Оба будут иметь эффект безопасной отмены любых асинхронных операций, которые все еще выполняются на sock
.
См. Также отличное: Зачем мне нужна цепочка на соединение при использовании boost :: asio?