我有一个回调函数,它将在一个我没有任何访问或控制权的线程中调用(一个库创建了该线程,并要求我将回调函数暴露给该线程)。由于zmq套接字不是线程安全的,所以我正在做的是:
void callback () {
zmq::socket_t tmp_sock(...); // create a socket which will be used only once
...
}
然而,非常频繁地调用回调(每秒数百次)。是否有更好的解决方案更有效地使用套接字?我之所以问这个是因为指南说:如果你打开和关闭很多套接字,这可能是你需要重新设计应用程序的标志。
编辑:
根据@ raffian的回答。回调函数中的thread_local static
(在C ++ 11中可用)变量工作正常。
答案 0 :(得分:1)
我问同样的问题,但在Java:
主体是相同的:预初始化一个工作线程池,每个线程都有一个专用套接字,可以用于读/写。在Java示例中,我使用ThreadLocal
;我想在C ++中你可以使用#include <boost/thread/tss.hpp>
。这种方法与ZeroMq的指南一致;在创建它们的线程中使用 套接字。
我不是C ++程序员,但如果你使用这种方法,你将不得不这样做:
void callback () {
workerPool.doTask( new Task(args here));
...
}
创建带有参数的Task
,并将其发送到workerPool,并将其分配给具有专用套接字的线程。您将需要创建具有足够线程以容纳负载的工作池,但是,并发不应该是一个问题。