【发布时间】:2017-01-23 09:50:10
【问题描述】:
我开始将 ZeroMQ 用于 IPC,并制作了一个简单的 echo-client/server,我对一件事感到惊讶。这是 C++ 代码(使用 zmq.hpp 和 zmq_addon.hpp)。
服务器:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("ipc:///tmp/machine-1");
while (1) {
zmq::multipart_t m;
m.recv(socket);
int i = m.poptyp<int>();
i++;
m.addtyp<int>(i);
m.send(socket);
}
客户:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REQ);
socket.connect("ipc:///tmp/machine-1");
int i = 0;
while (1) {
int save = i;
zmq::multipart_t m;
m.addtyp<int>(i);
m.send(socket);
m.recv(socket);
i = m.poptyp<int>();
if (i != (save + 1))
break;
if ((i % 100000) == 0)
std::cerr << "i : " << i<< "\n";
}
我按预期工作。客户端发送int,服务器加一并将其发回。
现在我不明白的魔力:我意识到,我可以并行运行客户端多次,并且它继续为每个客户端正确工作。
比较 save+1 和 i 的检查总是可以的。
ZMQ如何处理服务器端的并发问题?它如何知道必须将响应发送回哪个客户端?
关于 SO 有这个问题,但它没有回答我的问题:ZeroMQ REQ/REP on ipc:// and concurrency
【问题讨论】:
标签: c++ concurrency zeromq