Hi, I am now working on a simple case where a multi-threaded program tries to 
send a message to a proxy. The program is written in C and the czmq-3.0.2_3 is 
used. The platform is Mac OS X.

Here is the the code fragment of the sender:

  publisher = zsock_new_pub (">tcp://localhost:5559");
 zsock_resolve (publisher);
 ....
 str = "abc";
 //usleep(2000);
 zstr_send (publisher, str);


Here is the code fragment of the proxy:

 bool verbose = true;

    // Create and configure our proxy
 zactor_t *proxy = zactor_new (zproxy, NULL);
 assert (proxy);
 if (verbose) {
     zstr_sendx (proxy, "VERBOSE", NULL);
     zsock_wait (proxy);
 }
    zstr_sendx (proxy, "FRONTEND", "XSUB", "tcp://*:5559", NULL);
    zsock_wait (proxy);
    zstr_sendx (proxy, "BACKEND", "XPUB", "tcp://*:5560", NULL);
    zsock_wait (proxy);

    // Test capture functionality
    zsock_t *capture = zsock_new_pull ("inproc://capture");
    assert (capture);

    // Switch on capturing, check that it works
    zstr_sendx (proxy, "CAPTURE", "inproc://capture", NULL);
    zsock_wait (proxy);

    // Setup loop for captures
    zloop_t *loop = zloop_new ();
    assert (loop);
    zloop_set_verbose (loop, verbose);

    // Set up reader for captures
    int rc = zloop_reader (loop, capture, capture_event, NULL);
    assert (rc == 0);
    zloop_reader_set_tolerant (loop, capture);
    zloop_start (loop);

capture_event is the call back function:

static int
capture_event (zloop_t *loop, zsock_t *reader, void *arg)
{
    zmsg_t *msg = zmsg_recv (reader);
    char *msg_str = zmsg_popstr (msg);
    printf ("CAPTURED: %s\n", msg_str);
    free (msg_str);
    zmsg_destroy (&msg);
    return 0;
}

There is another process that can receive the data from the proxy by the port 
5560, which is not shown here. 

The problem is that if there is no sleep operation before zstr_send, the proxy 
cannot receive and print out the message. I also have tried to use 
sched_yield() to replace sleep but it does not work. Moreover, if there are 
more threads of sender, the sleep time needs to be longer to make sure that the 
proxy can receive all the messages. I am wondering if there is any way not to 
use sleep to send the message. 

Thanks


_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to