我正在尝试使用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;
}
答案 0 :(得分:6)
两个套接字都是REP。你想要的是REQ + REP。
答案 1 :(得分:3)
您正在创建线程后立即关闭套接字和ZeroMQ。他们可能没有时间达到阻塞状态,如果他们这样做,他们会在你破坏zmq上下文后立即失败。来自zmq_term man page:
上下文终止按以下步骤执行:
当前在上下文中打开的套接字上正在进行的任何阻止操作都应立即返回,错误代码为ETERM。
答案 2 :(得分:0)
首先,正如@sustrik指出你需要使用REQ
和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, &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, &reply, 0);
zmq_msg_close (&reply);
}
zmq_close (clients);
zmq_term (context);
return 0;
}