gpt4 book ai didi

c++ - 工作线程中的同步 ioctl 与异步 ioctl

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:49 26 4
gpt4 key购买 nike

在一个简单的 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);
}

为什么这两种方法的行为不同?我的逻辑有问题吗?

最佳答案

如果它锁定了线程,则意味着您需要通过让处理器休眠或类似的方式来交还处理器。当您调用它时,WaitForSingleObject 会默认执行此操作。我不确定,但我认为将 null 放入 DeviceIoControl 函数会使其等待,同时保持对线程的控制 - 从而锁定线程。

关于c++ - 工作线程中的同步 ioctl 与异步 ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com