//
// Multithreaded relay in C++
//
// Olivier Chamoux <moc.puorgselaht.rf|xuomahc.reivilo#moc.puorgselaht.rf|xuomahc.reivilo>
#include "zhelpers.hpp"
// Step 1 pushes one message to step 2
void *step1 (void *arg) {
zmq::context_t * context = static_cast<zmq::context_t*>(arg);
// Signal downstream to step 2
zmq::socket_t sender (*context, ZMQ_PAIR);
sender.connect("inproc://step2");
s_send (sender, "");
return (NULL);
}
// Step 2 relays the signal to step 3
void *step2 (void *arg) {
zmq::context_t * context = static_cast<zmq::context_t*>(arg);
// Bind to inproc: endpoint, then start upstream thread
zmq::socket_t receiver (*context, ZMQ_PAIR);
receiver.bind("inproc://step2");
pthread_t thread;
pthread_create (&thread, NULL, step1, context);
// Wait for signal
s_recv (receiver);
// Signal downstream to step 3
zmq::socket_t sender (*context, ZMQ_PAIR);
sender.connect("inproc://step3");
s_send (sender, "");
return (NULL);
}
// Main program starts steps 1 and 2 and acts as step 3
int main () {
zmq::context_t context(1);
// Bind to inproc: endpoint, then start upstream thread
zmq::socket_t receiver (context, ZMQ_PAIR);
receiver.bind("inproc://step3");
pthread_t thread;
pthread_create (&thread, NULL, step2, &context);
// Wait for signal
s_recv (receiver);
std::cout << "Test successful!" << std::endl;
return 0;
}