【发布时间】:2018-03-07 14:34:24
【问题描述】:
我有以下一段 c++ 代码,它打开一个 ZMQ-subscriber-socket 并在无限循环中接收消息。
listener.cc:(代码应该可以工作,编译:g++ -lzmq listener.cc)
#include <iostream>
#include <zmq.hpp>
class Listener {
public:
Listener() {
std::cout << "constructor call" << std::endl;
// Not working:
// zmq::context_t context(1);
// sck = new zmq::socket_t(context, ZMQ_SUB);
// sck->connect("tcp://127.0.0.1:9999");
// sck->setsockopt( ZMQ_SUBSCRIBE, "", 0);
std::cout << "constructor end" << std::endl;
}
void run() {
// Ok:
zmq::context_t context(1);
sck = new zmq::socket_t(context, ZMQ_SUB);
sck->connect("tcp://127.0.0.1:9999");
sck->setsockopt(ZMQ_SUBSCRIBE, "", 0);
while (1) { // Receive messages, not interesting:
std::cout << "listening..." << std::endl;
zmq::message_t message;
sck->recv(&message);
std::cout << "received something" << std::endl;
}
}
zmq::socket_t *sck;
};
int main(int argc, char *argv[]) {
Listener listener;
std::cout << "foo" << std::endl;
listener.run();
return 0;
}
到目前为止,代码按预期工作:
$ g++ -lzmq listener.cc
$ ./a.out
constructor call
constructor end
foo
listening...
但是,我想将 zmq-context/socket 的初始化移动到类的构造函数中(被注释掉的部分)。但是代码根本不会从构造函数调用中返回,构造函数中的所有语句都被执行,但是main 的第二行没有被执行,程序被卡住了。输出是:
$ g++ -lzmq listener.cc
$ ./a.out
constructor call
constructor end
我唯一想到的是主线程由于某种原因停止执行。谁能解释一下并提供解决方案?
干杯
【问题讨论】:
标签: c++ multithreading zeromq