工作线程中的同步与异步ioctl

时间:2011-09-28 16:39:56

标签: c++ mfc

在一个简单的MFC应用程序中,我需要一个工作线程,不断轮询ioctl以查找事件。起初,我试图在while循环中使用非重叠的ioctl来实现这一点。我认为它的方式是,如果ioctl没有立即完成io请求,线程将控制或上下文切换到另一个线程(主线程或MFC消息控制循环),而是锁定应用程序。

在第二次尝试中,我使用了重叠,问题就消失了。但在我看来,这两个方法在行为上是相同的,因为我使用等待事件(io请求完成)触发的WaitForSingleObject。

基本布局如下。请注意,以下代码不完整,只显示构造

同步:

WaitForIo {
    do {
        DeviceIoControl(hDevice,ioctl_code, ..., NULL);
        do something after io request completed
    } while(1);
    return;
}

异步:

WaitForIo {
    do {
        Overlapped ov;
        //CreateEvent
        DeviceIoControl(hDevice,ioctl_code, ..., &ov);
        WaitForSingleObject
        do something after io request completed
    } while(1);
}

为什么这两种方法的表现不同?我的逻辑有什么不对吗?

1 个答案:

答案 0 :(得分:0)

如果它锁定线程,则意味着您需要通过使处理器休眠或类似的东西来回馈处理器。 WaitForSingleObject在您调用它时默认执行此操作。我不确定它,但我认为在DeviceIoControl函数中设置null使它等待,同时保持对线程的控制 - 因此锁定线程。