将 ZMQ 上下文传递给线程
Pass ZMQ context to thread
在 C++ 中,我使用 ZeroMQ 构建一个简单的客户端-服务器聊天应用程序。一旦在 main 中初始化了上下文,我想将它传递给一个线程并在那里声明用于输出用户消息的套接字(即执行 send)。这是我当前的代码(client/user 端):
void Send(zmq::context_t& c ) // To get messages from user and send them to the server
{
zmq::socket_t socket(c, ZMQ_REQ);
socket.connect ("tcp://192.168.1.84:5555");
std::string mssg;
while (true) {
std::getline(std::cin, mssg);
if(mssg == "#exit")
{
killApp = true; // an atomic<bool> used to terminate all threads
break;
}
zmq::message_t mssg_(mssg.length());
std::memcpy(mssg_.data(), mssg.data(), mssg.length());
socket.send(mssg_);
}
}
int main ()
{
// Initialising the context
std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK
{
// do some stuff in the main thread (e.g. display the messages)
}
t_send.join();
return 0;
}
我正在尝试通过对线程的引用来传递上下文,以便我可以创建套接字并执行其余操作。但我不知道如何正确地做到这一点。 (或者,传递 zmq::socket_t 也可以,但我在尝试这样做时遇到了同样的问题)。
我是这样解决的:将上下文作为 void pointer 传递,然后将其转换回 zmq::context_t:
void Send(void* context ) // To get messages from user and send them to the server
{
zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ);
s.connect ("tcp://192.168.1.84:5555");
...
...
}
int main()
{
std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
std::thread t_send(Send, static_cast<void*>(context.get()));
...
return 0;
}
希望对以后的人有所帮助。
您可以在 zmqHelper 中找到一些示例。有一个聊天示例,许多线程通过 inproc 套接字进行通信(共享上下文),以及一个与工作人员的服务器(也通过 inproc 连接)。
在 C++ 中,我使用 ZeroMQ 构建一个简单的客户端-服务器聊天应用程序。一旦在 main 中初始化了上下文,我想将它传递给一个线程并在那里声明用于输出用户消息的套接字(即执行 send)。这是我当前的代码(client/user 端):
void Send(zmq::context_t& c ) // To get messages from user and send them to the server
{
zmq::socket_t socket(c, ZMQ_REQ);
socket.connect ("tcp://192.168.1.84:5555");
std::string mssg;
while (true) {
std::getline(std::cin, mssg);
if(mssg == "#exit")
{
killApp = true; // an atomic<bool> used to terminate all threads
break;
}
zmq::message_t mssg_(mssg.length());
std::memcpy(mssg_.data(), mssg.data(), mssg.length());
socket.send(mssg_);
}
}
int main ()
{
// Initialising the context
std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK
{
// do some stuff in the main thread (e.g. display the messages)
}
t_send.join();
return 0;
}
我正在尝试通过对线程的引用来传递上下文,以便我可以创建套接字并执行其余操作。但我不知道如何正确地做到这一点。 (或者,传递 zmq::socket_t 也可以,但我在尝试这样做时遇到了同样的问题)。
我是这样解决的:将上下文作为 void pointer 传递,然后将其转换回 zmq::context_t:
void Send(void* context ) // To get messages from user and send them to the server
{
zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ);
s.connect ("tcp://192.168.1.84:5555");
...
...
}
int main()
{
std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
std::thread t_send(Send, static_cast<void*>(context.get()));
...
return 0;
}
希望对以后的人有所帮助。
您可以在 zmqHelper 中找到一些示例。有一个聊天示例,许多线程通过 inproc 套接字进行通信(共享上下文),以及一个与工作人员的服务器(也通过 inproc 连接)。