winsock api会自动多线程吗?
Posted
技术标签:
【中文标题】winsock api会自动多线程吗?【英文标题】:Does winsock api multithread automatically? 【发布时间】:2012-10-22 07:55:18 【问题描述】:我正在使用 Microsoft Windows WinSock API 的小型 http 服务器。
在处理多个用户时是否需要应用多线程逻辑?
目前Windows在有网络事件和每条消息时都会发送一条消息 携带(在 wParam 中)要在 send() 或 recv() 中使用的套接字。
当客户端 A 连接并请求几个文件时,通常会有多个套接字 由 Winsock 创建。然后我的服务器收到一条消息“将此文件发送到 套接字 123”和更高版本“将该文件发送到套接字 456”
当另一个客户端连接时,它也会获得一些套接字,比如 789 和 654。
然后我的服务器使用提供的套接字号响应发送数据的请求。它 不必知道谁想要该文件,因为必须将正确的文件发送到 正确的插座。
不知道Windows本身在处理时是否使用了多线程 接受连接并将消息发送到我的程序。
所以我的问题是:
在处理多个用户时是否需要应用多线程逻辑?如果是这样的话 我应该在哪一点上创建一个线程?
【问题讨论】:
【参考方案1】:您通常为每个套接字使用一个线程。而如果你正在接受连接,则循环中的一个线程要阻塞,等待传入的连接套接字。然后创建一个新线程并将这个套接字句柄传递给新线程来处理。当该连接关闭并完成时,只需让该线程终止(或加入)。这是线程服务器的基础。
在伪代码中...
loop
socket = accept();
new ThreadHandler( socket )
使用单个线程处理多个套接字很棘手,主要是因为线程在写入时会阻塞(停止、等待),或者更常见的是从套接字读取。这不适合胆小的人。
【讨论】:
【参考方案2】:对于大多数应用程序,使用多个线程来处理网络连接是没有意义的。我在回复this question 时写了一篇小文章。
当处理接收到的数据需要不可预测的 CPU 时间时,例如在数据库服务器中,或者当程序结构不允许异步处理请求时,多线程变得有用。
还有第三种选择,“工人池”。单个线程处理所有传入连接并反序列化传入请求,然后将工作项传递给一次处理一个项的线程池。
这样,简单地打开一个连接还不会消耗整个线程所需的资源,并且系统负载隐含地受到池中线程数的限制。
【讨论】:
以上是关于winsock api会自动多线程吗?的主要内容,如果未能解决你的问题,请参考以下文章