在回调函数中使用zmq套接字

时间:2013-08-09 04:11:54

标签: c++ zeromq

我有一个回调函数,它将在一个我没有任何访问或控制权的线程中调用(一个库创建了该线程,并要求我将回调函数暴露给该线程)。由于zmq套接字不是线程安全的,所以我正在做的是:

void callback () {
    zmq::socket_t tmp_sock(...); // create a socket which will be used only once
    ...
}

然而,非常频繁地调用回调(每秒数百次)。是否有更好的解决方案更有效地使用套接字?我之所以问这个是因为指南说:如果你打开和关闭很多套接字,这可能是你需要重新设计应用程序的标志。

编辑: 根据@ raffian的回答。回调函数中的thread_local static(在C ++ 11中可用)变量工作正常。

1 个答案:

答案 0 :(得分:1)

我问同样的问题,但在Java

主体是相同的:预初始化一个工作线程池,每个线程都有一个专用套接字,可以用于读/写。在Java示例中,我使用ThreadLocal;我想在C ++中你可以使用#include <boost/thread/tss.hpp>。这种方法与ZeroMq的指南一致;在创建它们的线程中使用 套接字。

我不是C ++程序员,但如果你使用这种方法,你将不得不这样做:

void callback () {
    workerPool.doTask( new Task(args here));
    ...
}

创建带有参数的Task,并将其发送到workerPool,并将其分配给具有专用套接字的线程。您将需要创建具有足够线程以容纳负载的工作池,但是,并发不应该是一个问题。

相关问题