c++ ZMQ从不同线程同时轮询和发送

lx0bsm1f  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(209)

我有一个使用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_sendzmq_msg_recv不同时发生,但我不确定发送时轮询的安全性。
有关设置的详细信息:使用PAIR接口与单一客户端和服务器。2所有消息都很小(〈1KB)。3只有一个套接字共享发送和接收。
这是一个很大的,有十年历史的应用程序,如果可能的话,我希望避免重新设计。

lawou6xi

lawou6xi1#

我在zeromq文档中所看到的是套接字不应该在线程之间共享。不过我理解你的问题,重新设计一个大的旧应用程序从来都不有趣。
有没有可能你可以切换出套接字使用一个较新的线程安全的?我知道你正在使用PAIR,但也许下面的一个会给予你相同的功能
线程安全模式:

  • ZMQ_客户端
  • ZMQ_服务器
  • ZMQ_培养皿
  • ZMQ_无线电
  • ZMQ_散射
  • ZMQ_聚集

相关问题