zeromq - 了解 ZMQ - 用于多线程的 PAIR 套接字

标签 zeromq

引用http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdf 第 67 页。

问题> 我不明白为什么下面的代码适合多线程。根据我的理解,主线程在等待子线程反馈的同时可以做不同的事情。

但是,在下面的代码中,似乎在调用 char *string = s_recv (receiver); 时,step2 被阻止,并且在调用 char *string = s_recv (receiver); 时,step3 被阻止了接收器);

根据我的理解,(step_i+1)能够自由地做一些事情,直到收到来自step_i的信号。但是,正如您在代码中看到的,步骤2和步骤3都被阻止并且无法执行任何操作。为什么这是多线程代码?

谢谢

//  Multithreaded relay

#include "zhelpers.h"
#include <pthread.h>

static void *
step1 (void *context) {
    //  Connect to step2 and tell it we're ready
    void *xmitter = zmq_socket (context, ZMQ_PAIR);
    zmq_connect (xmitter, "inproc://step2");
    printf ("Step 1 ready, signaling step 2\n");
    s_send (xmitter, "READY");
    zmq_close (xmitter);

    return NULL;
}

static void *
step2 (void *context) {
    //  Bind inproc socket before starting step1
    void *receiver = zmq_socket (context, ZMQ_PAIR);
    zmq_bind (receiver, "inproc://step2");
    pthread_t thread;
    pthread_create (&thread, NULL, step1, context);

    //  Wait for signal and pass it on
    char *string = s_recv (receiver);
    free (string);
    zmq_close (receiver);

    //  Connect to step3 and tell it we're ready
    void *xmitter = zmq_socket (context, ZMQ_PAIR);
    zmq_connect (xmitter, "inproc://step3");
    printf ("Step 2 ready, signaling step 3\n");
    s_send (xmitter, "READY");
    zmq_close (xmitter);

    return NULL;
}

int main (void)
{
    void *context = zmq_ctx_new ();

    //  Bind inproc socket before starting step2
    void *receiver = zmq_socket (context, ZMQ_PAIR);
    zmq_bind (receiver, "inproc://step3");
    pthread_t thread;
    pthread_create (&thread, NULL, step2, context);

    //  Wait for signal
    char *string = s_recv (receiver);
    free (string);
    zmq_close (receiver);

    printf ("Test successful!\n");
    zmq_ctx_destroy (context);
    return 0;
}

最佳答案

按照我的理解,示例代码仅显示如何让主线程(步骤3)知道其他两个线程已创建并正确连接。来自步骤 1 的信号通过步骤 2 到达步骤 3,因此一旦信号到达,一切就已准备就绪并准备就绪。这应该很快就会发生。

当线程完成后,您可以传递一条新消息,显示 DONE,而不是加入它们。步骤 1 完成后将发送此消息。其他每个步骤完成后都会开始等待此消息,当收到消息时,会将其传递到下一步。当step3收到DONE消息时,所有线程都完成。

或者您可以使用此类消息来累积每个线程的工作结果。

您不是等待对象,而是开始同步接收消息。您无需发送通知,而是发送消息。

所以如果我理解正确的话,多线程工作应该发生在这些同步消息之间。


编辑

it seems that the step2 is blocked while calling s_recv

在这个例子中这很好,因为步骤2除了等待READY消息之外没有什么有用的事情可做。如果在您的用例中,线程必须执行工作并定期检查是否有消息在等待,它可以使用 ZMQ_DONTWAIT 标志以非阻塞模式调用 zmq_recv ,检查消息是否已到达。

关于zeromq - 了解 ZMQ - 用于多线程的 PAIR 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16202003/

相关文章:

zeromq - Majordomo 经纪人 : handling large number of connections

python - ROS:ZeroMQ 是否更适合大数据流,例如原始图像,而不是原生图像主题?

c++ - ZeroMQ 推/拉

zeromq - 使用 ØMQ 在对等方之间发送异步无回复消息的最佳方式是什么?

c++ - 在 Mac 上链接到 zeromq 的编译版本时发出编译 Go 程序的问题

php - Ratchet PHP WAMP - React/ZeroMQ - 特定用户广播

python - 理解ZMQ的HWM

sockets - 将zeromq套接字连接到redis服务器进行数据传输?

c++ - 0MQ : on passing a context to a pool of threads a Segmentation fault was thrown

node.js - ZeroMQ 和 Sails.js