Безопасно ли в ZeroMQ использовать zmq_poll() сокет REP + send() из нескольких потоков?
Мне интересно, если ZeroMQ REP
розетка может быть poll()
-ed на входящие данные в одном потоке и используется для отправки данных из другого потока.
Идея, которой я пытаюсь следовать, заключается в следующем:
REP
Сокет ничего не получит, пока не отправит ответ на входящий запрос. Таким образом, если zmq_poll()
был вызван для такого сокета, он просто заблокировал (до тайм-аута или навсегда).
Теперь, пока этот разъем является частью zmq_poll()
вызов для входящих данных, что происходит, если другой поток подготовил ответ и использует этот сокет для отправки этого ответа.
Безопасно ли это делать или возможны гоночные условия?
1 ответ
ZeroMQ был основан на нескольких принципах.
Разделение нуля является одним из основных принципов.
В то время как пользователь может на свой страх и риск экспериментировать с совместным использованием, лучшие практики ZeroMQ избегают этого, за исключением очень немногих и очень специфических случаев, а не на уровне сокетов. Сокеты заведомо не поточнобезопасны из-за более высокой общей производительности и меньшей задержки.
По этой причине вопрос "Что произойдет, если другой поток..." может звучать правомерно, но не в зоне ZeroMQ Best Practices.