中断另一个线程对zmqpp::poller::poll()的调用

Interrupt a call to zmqpp::poller::poll() from another thread

本文关键字:调用 poll poller 线程 zmqpp 中断 另一个      更新时间:2023-10-16

我正在使用ZeroMQ的zmqpp c++绑定来构建PUB/SUB通信。

在订阅者端,有2个线程——mainThreadpollingThread

pollingThread有阻塞呼叫zmqpp::poller::poll(zmqpp::poller::wait_forever)

如何从mainThread中中断/取消pollingThreadpoll()的调用?

编辑1:我使用std::thread,所以我不能中断线程。

EDIT2:这基本上是pollingThread的功能。

void pollingThread()
{
    while (threadCanRun())
    {
        // wait indefinitely for a new message
        if (mySocketPoller->poll())
        {
            functionToCallWhenAMessageArrives();
        }
    }
}

在我看来,推荐的方法是依靠消息传递来处理这个问题。

这意味着:

    创建一对INPROC pair套接字。每个线程一个。连接他们。
  1. 在轮询线程上,也在PAIR套接字上的poll()
  2. 当你想中断轮询线程时,从你的PAIR套接字发送一个消息给轮询线程的PAIR套接字。
  3. 调用poll()将返回。

请注意,这个解决方案虽然是推荐的,但需要您更改代码位。

    if (mySocketPoller->poll())
    {
        if (mySocketPoller->has_input(my_pair_socket))
        {
         // interrupted.
        }
        functionToCallWhenAMessageArrives();
    }