【发布时间】:2014-10-16 22:43:07
【问题描述】:
我正在尝试提出如何有效地使用 ZMQ 进行多线程(因此发送不会阻塞接收并且接收不会阻塞发送)。
我想使用ZMQ_DONTWAIT标志但是在发送数据时,它有时不会发送(EAGAIN错误,所以我必须重新排队处理消息,这在处理兆字节时浪费资源数据)。
我确实想出了以下代码:
Concurrency::concurrent_queue<zmq::message_t> QUEUE_IN;
Concurrency::concurrent_queue<zmq::message_t> QUEUE_OUT;
void SendThread(zmq::context_t &context) {
zmq::socket_t zmq_socket(context, ZMQ_DEALER);
zmq_socket.connect(string_format("tcp://%s:%s", address, port).c_str());
zmq::message_t reply;
while (true) {
while (QUEUE_OUT.try_pop(reply))
zmq_socket.send(reply);
Sleep(1);
}
}
void RecvThread(zmq::context_t &context) {
zmq::socket_t zmq_socket(context, ZMQ_DEALER);
zmq_socket.connect(string_format("tcp://%s:%s", address, port).c_str());
zmq::message_t reply;
while (true) {
while (zmq_socket.recv(&reply))
QUEUE_IN.push(reply);
}
}
void ConnectionThread()
{
zmq::context_t context(1);
std::thread* threads[2] = {
new std::thread(SendThread, context),
new std::thread(RecvThread, context)
};
threads[0]->join();
}
但是,这将需要服务器端的两个套接字,并且我需要确定我需要向哪个发送数据以及我需要在服务器端监听哪个,对吗? 有没有办法在多线程环境中使用一个套接字而使用发送和接收?
我可能想在一个套接字上异步执行此操作,但在研究了异步示例之后,我仍然没有理解这个想法,因为它周围没有太多的 cmets。
【问题讨论】:
标签: c++ multithreading sockets zeromq