1

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

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

但是,回调被非常频繁地调用(每秒数百次)。有没有更好的解决方案来更有效地使用套接字?我问这个是因为指南说:如果您打开和关闭很多套接字,这可能表明您需要重新设计您的应用程序。

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

4

1 回答 1

1

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

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

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

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

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

于 2013-08-09T06:32:36.140 回答