HI Folks,
我有一个线程化的C ++程序,其中最多三个线程在三个单独的套接字描述符上调用select,等待数据变为可用。每个线程处理一个套接字并将其添加到readfds,超时为300秒。选择返回后,如果有可用数据,我正在调用recv来读取它。
对于winsock和线程,我需要注意什么,因为由于某些原因,在几个小时之后,所选择的调用似乎都没有超时。多线程程序可以从多个线程中进行选择吗?
我知道我应该有一个线程监听所有三个套接字但是对于这个应用程序来说这将是一个很大的改变,我只是想应用一个bug修复。
欢呼声,
马丁。
答案 0 :(得分:2)
没有一些代码,我只能猜测。 无法正常运行select
超时的最常见原因是struct timeval
参数在循环的每次迭代中都不会重置。一些(所有?)select
实现更新超时参数以反映阻塞所花费的时间。但是,这通常会导致select
无法阻止。
你确定select
是问题吗?你没有其他的东西像堆栈损坏,内存泄漏等那样?
编辑:我在Windows之前使用过不同套接字上的多个线程中的select而没有问题。我忘了在最初的帖子中提到这一点。
答案 1 :(得分:-1)
我假设可以在不同的线程上使用select,因为以下链接表示它很棒。
http://tangentsoft.net/wskfaq/intermediate.html#threadsafety