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



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

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

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

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

我问了同样的问题,但在Java中:

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

我不是C++程序员,但如果你使用这种方法,你就必须做这样的事情:

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

创建一个带有参数的Task,并将其发送到workerPool,在那里它被分配给一个具有专用套接字的线程。您将希望创建具有足够线程以适应负载的工作池,然而,并发性不应该是一个问题。

最新更新