c++ - 选择调用似乎没有超时

标签 c++ visual-studio multithreading tcp winsock

大家好,

我有一个线程化的 C++ 程序,其中最多三个线程在三个独立的套接字描述符上调用 select 以等待数据可用。每个线程处理一个套接字并将其添加到 readfds,超时为 300 秒。在 select 返回后,如果有可用数据,我将调用 recv 来读取它。

对于 winsock 和线程,有什么我需要注意的吗,因为出于某种原因,几个小时后,选择调用似乎都没有超时。多线程程序可以毫无问题地从多个线程中进行选择吗?

我知道我应该让一个线程监听所有三个套接字,但这对这个应用程序来说是一个很大的改变,我只是想应用一个错误修复。

干杯,

马丁。

最佳答案

没有一些代码,我只能猜测。 select 超时无法正常工作 的最常见原因是 struct timeval 参数在循环的每次迭代中都没有重置。一些(全部?)select 实现更新超时参数以反射(reflect)阻塞所花费的时间量。但是,这通常会导致 select 不阻塞。

您确定 select 是问题所在并且您没有发生其他问题,例如堆栈损坏、内存泄漏等?

编辑:我之前在 Windows 下使用过不同套接字上的多个线程的选择,没有问题。我忘了在最初的帖子中提到这一点。

关于c++ - 选择调用似乎没有超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2552656/

相关文章:

c# - 如果我主要是 C# 程序员,学习 C++ 可以获得哪些优势?

C++ OOP 基础知识(将对象分配为成员)

c++ - 模板别名和 sfinae

.net - 如何解决 google.apis.core 的问题无法安装 Google.Apis.Core 1.8.2 安装此包目标 'WindowsPhoneApp,Version=v8.1',

C++/BOOST:condition_variable::wait( )/notify( ) 是否确保线程等待的顺序?

c++ - 类型向量化的适当通用习惯用法?

asp.net-mvc - “个人”是一种类型,在给定上下文中无效

visual-studio - Visual Studio 路径的环境变量?

c# - C# 中线程的排队执行

multithreading - Rust 中的后台工作线程和同步