|
发表于 2009-6-16 16:36:34
|
显示全部楼层
在windows平台,和linux有很大差异。
完成端口,一般都是配合线程池来运行的。怎么配置线程池中的线程数量呢?按比较权威的说法,是CPU数目X2。
API里面,也有这个说明,
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads
);
NumberOfConcurrentThreads
[in] Maximum number of threads that the operating system can allow to concurrently process I/O completion packets for the I/O completion port. This parameter is ignored if the ExistingCompletionPort parameter is not NULL.
If this parameter is zero, the system allows as many concurrently running threads as there are processors in the system.
CPU X 2是一本书籍上面的建议和经验值,可自行测试决定。道理是因为某些线程操作会阻塞后续处理,所以要增加一些。
但是Proactor的事件处理循环,里面不牵扯到线程池的问题。这是有意的设计,而不是缺陷。这种设计更加灵活,也更加让人难以理解了。如果只在一个线程中运行Proactor循环,在多核、多CPU的系统上面,无法发挥完成端口全部的能力。所以要在多个线程中运行Proactor循环。 |
|