gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:25:13 24 4
gpt4 key购买 nike

我有一个无限循环的线程,它从套接字接收和处理数据。我希望该线程阻塞( 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com