我正在尝试使用ZMQ设置内部多线程中继,但是在ZMQ内某处完成ZMQ_PAIR处理后我得到一个异常,我只是没有看到原因。我把它简化到最低限度,它几乎与ZMQ中继样本http://zguide.zeromq.org/cpp:mtrelay上的相同,但问题仍然存在。对于我的生活,我看不出我哪里出错了。我唯一看到的不同是我使用std :: thread而不是posix线程。
以下是代码:
void Message::GetMessage(const MessageDefn &defn) {
zmq::context_t context(1);
zmq::message_t message;
zmq::socket_t receiver(context, ZMQ_PAIR);
receiver.bind("inproc://parser");
std::thread parser(&Message::ParseData, this, &context);
receiver.recv(&message);
// Error occurs here, after returning
return;
}
void *Message::GetData( zmq::context_t *ctx) {
zmq::socket_t sender(*ctx, ZMQ_PAIR);
sender.connect("inproc://requestor");
sender.send("Response", 8);
return NULL;
};
void *Message::ParseData(zmq::context_t *ctx) {
zmq::socket_t receiver(*ctx, ZMQ_PAIR);
receiver.bind("inproc://requestor");
std::thread requestor(&Message::GetData, this, ctx);
zmq::message_t response(100);
receiver.recv(&response);
zmq::socket_t sender(*ctx, ZMQ_PAIR);
sender.connect("inproc://parser");
sender.send("Parsed", 6);
return NULL;
}
以下是从VS2013调试器返回的内容
The thread 'std::_LaunchPad<std::_Bind<1,void * __ptr64,std::_Pmf_wrap<void * __ptr64 (__cdecl Server::Message::*)(zmq::context_t * __ptr64) __ptr64,void * __ptr64,Server::Message,zmq::context_t * __ptr64>,Server::Message * __ptr64,zmq::context_t * __ptr64> >::_Go' (0x2460) has exited with code 0 (0x0).
Debug Error!
Program: D:\Projects\build\Debug\AppTest.exe
R6010
- abort() has been called
(Press Retry to debug the application)
编辑#2:
好的,所以我想知道ZMQ,Visual Studio 2013和/或x64的nuget包的某些组合是否存在问题。我正在使用nuget包http://www.nuget.org/packages/libzmq_vc120。我创建了一个全新的64位控制台项目,它只有hello world客户端。 http://zguide.zeromq.org/cpp:hwclient,然后我必须添加c ++包装器https://github.com/zeromq/cppzmq/blob/master/zmq.hpp
当我运行它时,我得到的只是发送Hello 0a(a实际上是一个重音符号.`a),然后它挂起。没有得到任何收到。
我使用错误的nuget包吗?有没有人在VS2013下运行,可以分享他们如何设置它?