我正在运行一个完全可操作的IOCP TCP套接字应用程序。今天,我在考虑关键部分的设计,而现在我脑海里有一个无尽的问题:全局还是每个客户关键部分?我之所以这样,是因为我发现如果每个线程都依赖一个锁,就没有必要使用多个工作线程,对吗?我的意思是...现在我看不到100个同时运行的客户端有任何性能问题,但是如果10000个呢?

我的共享资源是每个客户端预先分配的结构,因此,每个客户端都有自己的IO上下文,套接字和内容。没有客户端之间的资源共享,因此我认为这是使用每个客户端CS的另一点。我使用一个接受线程和8个(处理器* 2)工作线程。此应用程序基本上是为小型(

最佳答案

“正确”的答案可能取决于您的设计,并发客户端的数量以及所需的可用硬件性能。

通常,我发现最好先处理最简单的方法,然后再剖析以找到热点。

但是...您说您没有客户端间共享的资源,因此我假设您唯一需要做的同步是围绕“每个连接”状态。

因为是每个连接,所以(对我而言)显而易见的设计是使每个连接状态都包含其自己的关键部分。您认为这种方法的缺点是什么?

单个共享锁的问题在于,您会在没有理由互相阻塞的连接(和线程)之间引入争用。这将对性能产生不利影响,并可能随着连接数量的增加而成为热点。

拥有每个连接锁后,您可能希望避免通过使IOCP线程简单地锁定以将补全放置在每个连接队列中进行处理来避免尽可能频繁地使用它。这样的优点是允许单个IOCP线程在每个连接上工作,并防止单个连接上阻塞其他IOCP线程。它也可以与“成功时跳过完成端口”处理配合使用。

10-07 23:52