我正在运行一个完全可操作的 IOCP TCP 套接字应用程序。今天我正在考虑关键部分的设计,现在我脑子里有一个无尽的问题:全局关键部分还是每个客户端关键部分?我之所以这样做是因为据我所知,如果每个线程都依赖于一个锁,那么使用多个工作线程是没有意义的,对吗?我的意思是...现在我没有发现 100 个并发客户端有任何性能问题,但如果是 10000 个呢?
我的共享资源是每个客户端预先分配的结构,因此,每个客户端都有自己的 IO 上下文、套接字和其他东西。没有客户端间的资源共享,所以我认为这是使用每个客户端 CS 的另一个要点。我使用 1 个接受线程和 8 个(处理器 * 2)个工作线程。该应用程序基本上是为小型(< 1KB)数据包设计的,但有时也用于文件流。
最佳答案
“正确”答案可能取决于您的设计、并发客户端的数量以及您对可用硬件的性能要求。
一般来说,我发现最好采用最简单的可行方法,然后进行分析以定位热点。
但是...您说您没有客户端间共享资源,因此我假设您需要做的唯一同步是围绕“每个连接”状态。
由于它是针对每个连接的,所以(对我来说)显而易见的设计是让每个连接状态包含其自己的关键部分。您认为这种方法的缺点是什么?
单个共享锁的问题在于,您会在没有理由相互阻塞的连接(和线程)之间引入争用。这将对性能产生不利影响,并且随着连接数量的增加可能会成为热点。
一旦您拥有了每个连接锁,您可能需要考虑通过让 IOCP 线程简单地锁定以将完成放入每个连接队列中进行处理来尽可能避免使用它。这样做的优点是允许单个 IOCP 线程在每个连接上工作,并防止单个连接被其他 IOCP 线程阻塞。它也适用于“成功时跳过完成端口”处理。
关于c++ - IOCP 关键部分设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20942877/