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会自动多线程吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有 winsock 和 std::thread 的 C++ 多线程服务器

Excel 在VBA中可否调用winsock控件

Java+线程内部调用实例方法会多线程安全吗?

多线程并发会造成程序周期性崩溃吗?

多线程客户端/服务端select模型

Java 多线程 资源冲突