c++ - 同时等待套接字和 bool var 的可移植 C++11 方法

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

我有一个无限循环的线程,它从套接字接收和处理数据。我希望该线程阻塞( sleep ),直到数据在套接字上可供读取或“退出” bool 变量变为真(由不同的线程设置)。是否有可能以一种可移植的方式做到这一点,无需轮询和使用任何第三方库(当然除了套接字库)?如果无法以可移植的方式执行操作,那么在 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
    }
}

最佳答案

设置消息队列。

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

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

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

我说“线程或任务”,因为让整个线程专用于等待太过分了。可悲的是,C++11 线程 doesn't support light weight tasks out of the box完美。

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

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

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

关于c++ - 同时等待套接字和 bool var 的可移植 C++11 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15859437/

相关文章:

c++ - C++ 的 3D 图形绘图

c++ - 二维数组/在 c++ (Arduino) 中初始化数据

windows - Windows 64 位上的 SWT

Java thread.getContext().getClassLoader() 唯一性

multithreading - QThread中的QTcpSocket

c++ - 动态转换、对象列表转换、模板

c++ - Mac OS OpenGL - CPU 使用问题

c++ - 获取 CPU/内存利用率的跨平台方式

c++ - 获取计算机名和登录用户名

c++ - 网络协议(protocol)设计异步单线程与同步多线程?