大家好,
我有一个线程化的 C++ 程序,其中最多三个线程在三个独立的套接字描述符上调用 select 以等待数据可用。每个线程处理一个套接字并将其添加到 readfds,超时为 300 秒。在 select 返回后,如果有可用数据,我将调用 recv 来读取它。
对于 winsock 和线程,有什么我需要注意的吗,因为出于某种原因,几个小时后,选择调用似乎都没有超时。多线程程序可以毫无问题地从多个线程中进行选择吗?
我知道我应该让一个线程监听所有三个套接字,但这对这个应用程序来说是一个很大的改变,我只是想应用一个错误修复。
干杯,
马丁。
最佳答案
没有一些代码,我只能猜测。 select
超时无法正常工作 的最常见原因是 struct timeval
参数在循环的每次迭代中都没有重置。一些(全部?)select
实现更新超时参数以反射(reflect)阻塞所花费的时间量。但是,这通常会导致 select
不阻塞。
您确定 select
是问题所在并且您没有发生其他问题,例如堆栈损坏、内存泄漏等?
编辑:我之前在 Windows 下使用过不同套接字上的多个线程的选择,没有问题。我忘了在最初的帖子中提到这一点。
关于c++ - 选择调用似乎没有超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2552656/