我有一个使用ZMQ在C应用程序和Python GUI之间发送和接收的程序,Python将所有命令发送给C应用程序来完成这项工作,C应用程序定期发回状态来更新GUI。
C是多线程的,但是我们从来没有让zmq_send
调用线程安全,所以在100个中有1个,000次运行,如果两个线程试图同时向gui发送状态,我们会得到一个未处理的异常或分段错误,这花费了我不愿意承认的时间,因为它是如此的零星。这个问题很容易用zmq_send
周围的互斥锁解决,因为套接字是由单例管理的。
除了处理线程之外,还有一个线程空闲地等待接收和分派来自gui的命令,该线程使用zmq_poll
,然后在有可用的东西时使用zmq_msg_recv
。
问题是,当发送发生时,我可以安全地轮询同一个套接字吗?大多数时候,接收线程都在zmq_poll
中等待超时,发送似乎没有问题。我似乎找不到任何关于这方面的好文档。我假设互斥锁需要保护zmq_send
和zmq_msg_recv
不同时发生,但我不确定发送时轮询的安全性。
有关设置的详细信息:使用PAIR接口与单一客户端和服务器。2所有消息都很小(〈1KB)。3只有一个套接字共享发送和接收。
这是一个很大的,有十年历史的应用程序,如果可能的话,我希望避免重新设计。
1条答案
按热度按时间lawou6xi1#
我在zeromq文档中所看到的是套接字不应该在线程之间共享。不过我理解你的问题,重新设计一个大的旧应用程序从来都不有趣。
有没有可能你可以切换出套接字使用一个较新的线程安全的?我知道你正在使用
PAIR
,但也许下面的一个会给予你相同的功能线程安全模式: