首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时等待套接字和bool var的可移植C++11方法

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

Stack Overflow用户
提问于 2013-04-07 06:03:59
回答 1查看 913关注 0票数 4

我有一个具有无穷循环的线程,它接收和处理来自套接字的数据。我希望该线程阻止(睡眠),直到数据在套接字上可用,或者“退出”布尔变量变为真(由另一个线程设置)。不需要轮询和使用任何第三方库(当然不包括套接字库),是否有可能以可移植的方式这样做呢?如果不可能以可移植的方式进行操作,那么在Windows下(仍然没有轮询和第三方库),最好的方法是什么呢?

示例代码:

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-04-09 13:51:42

设置消息队列。

这些消息的形式是"PleaseExit“或"DataOnSocket”。

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

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

我说的是“线程或任务”,因为拥有一个专门用于等待的整个线程是多余的。可悲的是,C++11完美地线程化了不支持轻量级任务

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

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

很远,很不理想,但它确实允许您在完全符合标准的C++11土地上这样做。并且可以从窗口为您提供一个类似于“等待多个对象”的接口。(实际上,在windows上,如果您的native_handle同步原语是可接受的,您可以取消大部分机器)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15859437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档