理解ZMQ - PAIR套接字用于多线程



参考http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdf67页。

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

然而,在下面的代码中,似乎step2在调用char *string = s_recv (receiver);时被阻塞,step3在调用char *string = s_recv (receiver);时被阻塞

根据我的理解,(step_i+1)能够做一些自由的事情,直到从step_i接收到信号。然而,正如您所看到的代码,step2和step3都被阻塞了,不能做任何事情。为什么这是一个多线程代码?

谢谢

//  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 2n");
    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 3n");
    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;
}

在我看来,示例代码只显示了如何让主线程(step3)知道其他两个线程已经创建并正确连接。来自step1的信号经过step2到step3,所以一旦它到达那里,一切都准备好了。这应该很快就会发生。

当线程完成,而不是加入他们,你可以传递一个新的消息,说DONE。步骤1在完成后发送此消息。其他步骤一旦完成就开始等待此消息,当它收到一条消息时,将其传递给下一步。当step3接收到DONE消息时,所有线程都完成了。

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

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

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


编辑
当调用s_recv 时,step2似乎被阻塞了。

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

最新更新