Я использую такую архитектуру в своем приложении. Я проверил несколько источников (для Linux) и не нашел ничего против.
Единственным формальным основанием, подтверждающим эту концепцию, является стандарт POSIX - он говорит, что sendto()
, а также select()
являются поточно-ориентированными функциями:
POSIX.1-2001 и POSIX .1-2008 требуют, чтобы все функции, указанные в стандарте, были потокобезопасными, за исключением следующих функций
(sendto
и select
не указаны) из https://linux.die.net/man/7/pthreads .
Таким образом, если функции потокобезопасны, их внутренние структуры надежно заблокированы, то смешивание этих двух функций также должно быть приемлемым. Однако я не считаю правильным смешивать select()
с recvfrom()
. Возможно, это не повредит программу, но пробуждение двух ожидающих потоков приведет к возникновению состояния гонки.
Что касается winsock, необходимо проверить документацию, насколько ее реализация соответствует стандарту POSIX. Единственное, что я обнаружил, это is winsock2 thread safe? , что частично отвечает на ваш вопрос. В Linux вы можете проверить его код с открытым исходным кодом: https://github.com/torvalds/linux/blob/master/net/socket.c https://github.com/torvalds/linux/blob/master/fs/select.c.
ОБНОВЛЕНИЕ : еще одна полезная ссылка https://groups.google.com/forum/#! Topic / comp.os. linux .networking / cLbMGRNw8EA