[zeromq-dev] Fwd: ZMQ Closure - Change of Beginners Documentation

Martin Sustrik sustrik at 250bpm.com
Thu May 26 21:35:39 CEST 2011

On 05/26/2011 07:03 PM, Pieter Hintjens wrote:
> On Thu, May 26, 2011 at 3:06 AM, Mike Pearce<mike at kaew.be>  wrote:

>> 2. It states that if the users application is doing a blocking read then
>> zmq_term is the means by which this blocked read will get unblocked. By
>> implication an application that implements a blocked read will need to be
>> multithreaded.
> This isn't accurate, though. A classic way of exiting a blocked read
> is to receive a message, or to be interrupted by a signal like SIGINT.

This was the case with old versions of 0MQ.

People were advised to send a termination message to worker threads to 
shut them down.

This added a lot of boilerplate code to any multithreaded application -- 
establishing a pub/sub topology for distributing the termination message 
from the main thread to worker threads, using zmq_poll in each worker 
thread instead of simple zmq_send/zmq_recv so that it can monitor both 
the "working" socket and "termination" socket etc.

The whole ZMQ_TERM semantics was implemeted as an attempt to get rid of 
this boilerplate code. What it does it basically handles the termination 
handshake between main thread and worker threads behind the scenes:

1. zmq_term() sends termination request from main thread to worker threds
2. each worker thread is notified about the termination by getting 
ZMQ_TERM from either next or ongoing call to any zmq* function
3. at this point the worker thread is free to do any clean-up
4. finally, worker thread closes all its sockets which generates a 
termination acknowledgement which is passed back to the main thread
5. receiving acknowledgements from all worker threads cause zmq_term to 
6. the main thread can safely terminate the process now


More information about the zeromq-dev mailing list