LINUX.ORG.RU

История изменений

Исправление 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, то обращаться к нему из параллельного треда не нужно, это плохая затея.