将 ZMQ 上下文传递给线程

Posted

技术标签:

【中文标题】将 ZMQ 上下文传递给线程【英文标题】:Pass ZMQ context to thread 【发布时间】:2016-08-21 20:08:55 【问题描述】:

在 C++ 中,我使用 ZeroMQ 构建一个简单的客户端-服务器聊天应用程序。一旦在 main 中初始化上下文,我想将它传递给一个线程并在那里声明用于输出用户消息的套接字(即执行 send)。这是我当前的代码(客户端/用户端):

void Send(zmq::context_t& c ) // To get messages from user and send them to the server

    zmq::socket_t socket(c, ZMQ_REQ);
    socket.connect ("tcp://192.168.1.84:5555");

    std::string mssg;

    while (true) 

        std::getline(std::cin, mssg);

        if(mssg == "#exit")
        
            killApp = true; // an atomic<bool> used to terminate all threads
            break;
        
        zmq::message_t mssg_(mssg.length());
        std::memcpy(mssg_.data(), mssg.data(), mssg.length());

        socket.send(mssg_);

   



int main ()

    // Initialising the context
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
    std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK

    
       // do some stuff in the main thread (e.g. display the messages)
    

    t_send.join();
    return 0;

我试图通过引用线程来传递上下文,这样我就可以创建一个套接字并执行其余的操作。但我不知道如何正确地做到这一点。 (或者,传递一个 zmq::socket_t 也可以,但我在尝试这样做时遇到了同样的问题。

【问题讨论】:

“我面临同样的问题” - 如果您真正说明“同样的问题”是什么以及您遇到了什么问题,您的问题会好得多。 我不推荐 zmq 作为入门框架。它将套接字 API 包装得如此之多,以至于您将无法理解发生了什么。另外,它仍然会丢失 TCP 通信中的第一条消息。请改用 boost asio。您将学习网络 IO 的基础概念。 在 Zmq 中,您可以共享上下文,但 从不 两个线程之间的套接字。为什么不(在您的原始代码中):zmq::context_t context (1); std::thread t_send(Send, context); 【参考方案1】:

这是我解决它的方法:将上下文作为 void pointer 传递,然后将其转换回 zmq::context_t

void Send(void* context ) // To get messages from user and send them to the server
 
    zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ);
    s.connect ("tcp://192.168.1.84:5555");
    ...
    ...


int main()

    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
    std::thread t_send(Send, static_cast<void*>(context.get()));
    ...
    return 0;

希望它对未来的人有所帮助。

【讨论】:

【参考方案2】:

您可以在zmqHelper 中找到一些示例。有一个聊天的例子,许多线程通过 inproc 套接字进行通信(共享上下文),以及一个带有工作人员的服务器(也通过 inproc 连接)。

【讨论】:

以上是关于将 ZMQ 上下文传递给线程的主要内容,如果未能解决你的问题,请参考以下文章

MVVM - 如何将上下文传递给存储库类?

Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?

将 NSManagedObjectContext 上下文传递给 ViewController 是 nil

SwiftUI - 将托管对象上下文传递给模型

将正确的“this”上下文传递给 setTimeout 回调?

通过 HOC 将 React 上下文传递给包装的组件