2

zeroMQ複数のスレッド間でメッセージング システムを実装する方法として使用しようとしています。以下のコードを試しましたが、うまくいきません。具体的には、各スレッドでの呼び出しは、zmq_recv実行されるメッセージを待機/ブロックしません。

このコードについて教えてください。

Linux OS と gcc を使用しています

よろしくお願いします

AFG

    static void *
    worker_routine (void *context) {
        // Socket to talk to dispatcher
        void *receiver = zmq_socket (context, ZMQ_REP);
        zmq_connect (receiver, "inproc://workers");
        while (1) {

            zmq_msg_t request;
            zmq_msg_init( &request );
            zmq_recv( receiver, &request, 0 );
            printf ("Received request\n");
            // Do some 'work'
            usleep (1000);
            // Send reply back to client
            zmq_send (receiver, &request, 0);
        }
        zmq_close (receiver);
        return NULL;
    }

    int main (void) {

    void *context = zmq_init (1);
    void *clients = zmq_socket (context, ZMQ_REP);
    zmq_bind (clients, "inproc://workers");

    int thread_nbr;
    for (thread_nbr = 0; thread_nbr < 5; thread_nbr++) {
        pthread_t worker;
        pthread_create (&worker, NULL, worker_routine, context);
    }

    zmq_close (clients);
    zmq_term (context);
    return 0;
    }
4

3 に答える 3

6

両方のソケットはREPです。必要なのはREQ+REPです。

于 2011-04-01T17:27:53.177 に答える
3

スレッドを作成した直後に、ソケットと ZeroMQ をシャットダウンしています。ブロック状態に到達する時間がない可能性があります。ブロック状態になった場合、zmq コンテキストを破棄するとすぐに失敗します。zmq_termのマニュアルページから:

コンテキストの終了は、次の手順で実行されます。

コンテキスト内で開いているソケットで現在進行中のブロック操作は、ETERM のエラー コードですぐに返されます。

于 2011-03-29T18:29:51.317 に答える
0

REQまず、@sustrik が指摘したように、 andを使用する必要があるためREP、メイン スレッドとワーカー スレッドの両方を にすることはできませんREP

次に、メイン スレッドに何らかのブロッキング ループを提供する必要があります。

int main (int argc, char **argv)
{
    void *context = zmq_init (1);
    void *clients = zmq_socket (context, ZMQ_REP); // use ZMQ_REQ on the clients
    zmq_bind (clients, "inproc://workers");

    int thread_nbr;
    for (thread_nbr = 0; thread_nbr < 5; thread_nbr++) {
        pthread_t worker;
        pthread_create (&worker, NULL, worker_routine, context);
    }

    while (TRUE)
    {
        // worker thread connected asking for work
        zmq_msg_t request;
        zmq_msg_init (&request);
        zmq_recv (clients, &amp;request, 0);
        zmq_msg_close (&request);

        // do whatever you need to do with the clients' request here

        // send work to clients
        zmq_msg_t reply;
        zmq_msg_init_data (&reply, "Reply", 5, NULL, NULL);
        zmq_send (clients, &amp;reply, 0);
        zmq_msg_close (&reply);
    }

    zmq_close (clients);
    zmq_term (context);
    return 0;
}
于 2011-04-06T15:08:18.413 に答える