История изменений
Исправление dvetutnev, (текущая версия) :
Блин, нафига вы в многопоточку лезете не разобравшись в асинхронке?)
В общем случаи синхронную операцию accept
прервать нельзя, закрывать сокет/аццпетор из другого потока лютый костыть.
Чтобы прерывать операцию она должна быть асинхронной. Если прерывается операция из того же потока, в котором она была запущена (и с которым потоком\экзекутором ассоциирован аццептор), то достаточно вызвать метод cancel
у аццептора. Если нужно все же из другого потока прервать операцию, то в экзекутор, прицепленный аццептору, отправляем функтор, который дернет cancel
.
boost::asio::any_io_executor executor = listener.get_executor();
boost::asio::post(executor,
[&listener]() { listener.cancel(); });
В этом случаи обращения к аццетору будут производиться только из одного треда и соответственно конкурировать не будут (в одном треде они только по очереди могут быть). Если для метода объекта явно не указано thread safe, то обращаться к нему из параллельного треда не нужно, это плохая затея.
Исправление dvetutnev, :
Блин, нафига вы в многопоточку лезете не разобравшись в асинхронке?)
В общем случаи синхронную операцию accept
прервать нельзя, закрывать сокет/аццпетор из другого потока лютый костыть.
Чтобы прерывать операцию она должна быть асинхронной. Если прерывается операция из того же потока, в котором она была запущена (и с которым потоком\экзекутором ассоциирован аццептор), то достаточно вызвать метод cancel
у аццептора. Если нужно все же из другого потока прервать операцию, то в экзекутор, прицепленный аццептору, отправляем функтор, который дернет cancel
.
boost::asio::any_io_executor executor = litener.get_executor();
boost::asio::post(executor,
[&listener]() { listener.cancel(); });
В этом случаи обращения к аццетору будут производиться только из одного треда и соответственно конкурировать не будут (в одном треде они только по очереди могут быть). Если для метода объекта явно не указано thread safe, то обращаться к нему из параллельного треда не нужно, это плохая затея.
Исходная версия dvetutnev, :
Блин, нафига вы в многопоточку лезете не разобравшись в асинхронке?)
В общем случаи синхронную операцию accept
прервать нельзя, закрывать его из другого потока лютый костыть.
Чтобы прерывать операцию она должна быть асинхронной. Если прерывается операция из того же потока, в котором она была запущена (и с которым потоком\экзекутором ассоциирован аццептор), то достаточно вызвать метод cancel
у аццептора. Если нужно все же из другого потока прервать операцию, то в экзекутор, прицепленный аццептору, отправляем функтор, который дернет cancel
.
boost::asio::any_io_executor executor = litener.get_executor();
boost::asio::post(executor,
[&listener]() { listener.cancel(); });
В этом случаи обращения к аццетору будут производиться только из одного треда и соответственно конкурировать не будут (в одном треде они только по очереди могут быть). Если для метода объекта явно не указано thread safe, то обращаться к нему из параллельного треда не нужно, это плохая затея.