2

请参阅http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdf 第 67 页。

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

但是,在下面的代码中,似乎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 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;
}
4

1 回答 1

2

按照我的阅读方式,示例代码只显示了如何让主线程(step3)知道其他两个线程已经创建并正确连接。来自第 1 步的信号通过第 2 步到第 3 步,因此一旦到达,所有信号都已设置好并准备就绪。这应该很快发生。

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

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

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

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


编辑

似乎step2在调用时被阻止了s_recv

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

于 2013-04-24T21:32:06.387 回答