我有一个具有无穷循环的线程,它接收和处理来自套接字的数据。我希望该线程阻止(睡眠),直到数据在套接字上可用,或者“退出”布尔变量变为真(由另一个线程设置)。不需要轮询和使用任何第三方库(当然不包括套接字库),是否有可能以可移植的方式这样做呢?如果不可能以可移植的方式进行操作,那么在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
}
}发布于 2013-04-09 13:51:42
设置消息队列。
这些消息的形式是"PleaseExit“或"DataOnSocket”。
当队列中出现任何内容,处理队列,然后再次等待队列时,线程或任务就会被激活。如果它得到"PleaseExit“,它反而会开始清理。
可能您必须有一个不同的线程/任务等待条件变量和套接字,以便将信息传送到统一队列。
我说的是“线程或任务”,因为拥有一个专门用于等待的整个线程是多余的。可悲的是,C++11完美地线程化了不支持轻量级任务。
基本上,该解决方案允许线程等待多个事件,方法是将对每个事件的等待委托给其他线程,这些线程发送“向上管道”通知。您可以想象创建一个公共基础结构,其中希望等待多个对象的线程告诉调度中心它在等待什么,然后等待它自己的条件变量。
调度中心等待线程想要等待的每一件事情,当它们发生时,确定应该通知哪些线程,然后通知它们。
很远,很不理想,但它确实允许您在完全符合标准的C++11土地上这样做。并且可以从窗口为您提供一个类似于“等待多个对象”的接口。(实际上,在windows上,如果您的native_handle同步原语是可接受的,您可以取消大部分机器)。
https://stackoverflow.com/questions/15859437
复制相似问题