4

我有一个无限循环的线程,它接收和处理来自套接字的数据。我希望该线程阻塞(睡眠),直到数据在套接字上可供读取或“退出”布尔变量变为真(由不同的线程设置)。是否可以在不轮询和使用任何第三方库(当然套接字库除外)的情况下以可移植的方式做到这一点?如果不可能以可移植的方式进行,那么在 Windows 下最好的方法是什么(仍然没有轮询和第三方库)?

示例代码:

bool exit = false; // or "std::atomic<bool> exit" or anything else
void fn()
{
    SOCKET s;
    // init socket, establish connection, etc
    for(;;)
    {
        // This thread goes to wait (blocks) until data becomes available on socket
        // OR exit var is set to true (by a different thread) - how?
        if(exit) break;
        // receive and process data from socket
    }
}
4

1 回答 1

1

设置消息队列。

这些消息的格式为“PleaseExit”或“DataOnSocket”。

当队列中出现任何内容时,您的线程或任务将被激活,处理队列,然后再次等待队列。如果它得到“请退出”,它就会开始清理。

可能您将不得不在条件变量和套接字上等待不同的线程/任务,以将信息传送到您的统一队列。

我说“线程或任务”,因为有一个专用于等待的整个线程是矫枉过正的。遗憾的是,C++11 线程并不能完美地支持开箱即用的轻量级任务。

基本上,该解决方案允许线程通过将每个事件的等待委托给其他线程来等待多个事件,这些线程“向上”发送通知。你可以想象创建一个通用的基础设施,你的线程想要等待多个对象告诉调度中心它在等待什么,然后等待它自己的条件条件变量。

调度中心等待你的线程想要等待的每一件事,当它们发生时继续确定应该通知哪些线程,然后通知它们。

远非理想,但它确实让您在完全符合标准的 C++11 领域中做到这一点。并且可以为您提供一个界面,类似于 Windows 中的“等待多个对象”。(事实上​​,在 Windows 上,如果native_handle您的 C++11 同步原语适用,您可以取消大部分机器)。

于 2013-04-09T13:51:42.007 回答