Portable C ++ 11同时在socket和bool var上等待的方法

时间:2013-04-07 06:03:59

标签: c++ windows multithreading sockets c++11

我有一个带有无限循环的线程,它接收并处理来自套接字的数据。我希望该线程阻塞(休眠),直到数据在套接字上可用于读取或“exit”布尔变量变为true(由不同的线程设置)。是否可以以便携方式进行轮询和使用任何第三方库(自然除了套接字库)?如果无法以便携方式进行,那么在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
    }
}

1 个答案:

答案 0 :(得分:1)

设置消息队列。

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

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

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

我说“线程或任务”,因为有一个专门用于等待的整个线程是矫枉过正。可悲的是,C ++ 11完美地线程doesn't support light weight tasks out of the box

基本上,此解决方案允许线程通过将每个事件的等待委托给其他线程来等待多个事件,其他线程将“通过管道”发送通知。您可以想象创建一个公共基础结构,您想要在多个对象上等待的线程告诉调度中心它正在等待什么,然后等待它自己的条件条件变量。

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

远非理想,但它确实让你在完全符合标准的C ++ 11版本中实现。并且可以为您提供一个类似于“等待多个对象”的界面。 (实际上,在Windows上,如果你的C ++ 11同步原语的native_handle是合适的,你就可以取消大部分的机制。)