【发布时间】:2014-01-23 12:07:54
【问题描述】:
在典型的 .NET 世界中,我们对大多数 I/O 操作使用基于事件的异步模式(Event Handler),更具体地说,据我所知,引入了 I/O 完成端口以提高调度线程的效率,就像线程池一样,因此我们不需要手动维护(初始化和销毁)线程来处理大量的 I/O 响应。
同时,我很自然地认为等待 I/O 响应不需要因为硬件中断而阻塞现代 Windows 系统中的任何线程,直到我在最近的项目中看到了一些 C++ 代码,甚至在 web.xml 中看到了一些示例代码。
我没有任何 C++ 经验
第一个代码是关于串口监听的,伪C++代码(我用C#风格输入)是这样的:
// loop checking the status
while(serialPort.Buffer.Count==0)
{
Thread.Sleep(100);
}
byte[] data = serialPort.Buffer;
// processing the actual data...
第二段代码是关于C++中I/O完成端口的使用:
while (::GetQueuedCompletionStatus(port,
&bytesCopied,
&completionKey,
&overlapped,
INFINITE))
{
if (0 == bytesCopied && 0 == completionKey && 0 == overlapped)
{
break;
}
else
{
// Process completion packet
}
}
显然,它们都阻塞了线程。
所以我的问题是:
为什么那些代码没有选择基于事件的无线程阻塞方式?
如果.NET底层使用第二个示例的代码,那么在做I/O操作时实际上有线程阻塞?
(可能有点跑题了)当前一个回调仍在执行时,.NET I/O 操作回调是否允许同时重新进入?(根据我有限的测试,答案是否定的)以及为什么?
【问题讨论】:
标签: c# c++ multithreading asynchronous threadpool