【问题标题】:Select calls seems to not time out选择通话似乎没有超时
【发布时间】:2010-03-31 12:00:46
【问题描述】:

大家好,

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

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

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

干杯,

马丁。

【问题讨论】:

  • @martsbradley,如果没有显示问题的示例代码,我们无法为您做很多非猜测。

标签: c++ visual-studio multithreading tcp winsock


【解决方案1】:

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

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

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

【讨论】:

  • 超时结构是在 Linux 机器上通过 select 更新的,我以前见过,所以我确定我不会重复这个问题。
【解决方案2】:

我假设在不同的线程上使用 select 是可以的,因为下面的链接说它很棒。

http://tangentsoft.net/wskfaq/intermediate.html#threadsafety

【讨论】:

  • 这应该是对您的 OP 的编辑,而不是对您自己的回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多