【问题标题】:Using zmq socket in a callback function在回调函数中使用 zmq 套接字
【发布时间】:2013-08-09 04:11:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我也有类似的问题。我计划使用线程本地存储来管理套接字。但我不知道它是否会起作用。

标签: c++ zeromq


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您提及tss.hpp。听起来很有希望,我会尝试将它融入我的程序中。 +1
  • 这里有一个post,关于如何在 boost 中动态初始化线程本地存储。
  • @tdelaney 感谢您提供链接。 C++11 中的thread_local 关键字也可以使用
猜你喜欢
  • 2012-09-14
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2018-01-15
  • 2018-11-26
相关资源
最近更新 更多