子线程中调用DeviceIoControl, ReadFile, Writefile的问题

guiyi518   2007-10-18 09:38 楼主
请问
    子线程中调用DeviceIoControl或者ReadFile,WriteFile会不会阻塞主线程
    为什么呢

    我在一个qq群上问过,有人说肯定会,原因是“因为这些函数都是同步函数(WinCE中),不是异步函数,在函数没有执行完成以前不会返回”
    但是我想问,OS分配给子线程的时间片在这个问题的回答上有作用吗?

回复评论 (6)

补充一下:

我是在Windows CE下做的应用,他的CreateFile不支持异步模式的,也就是CreateFile的最后一个lpOverlapped
只能为NULL。

但是就算如此,是不是就一定意味着我的问题的答案是肯定的呢
点赞  2007-10-18 10:29
非异步操作,肯定会阻塞主线程
点赞  2007-10-19 14:14
楼主写一个通信程序试一下,看看主程序还能干别的事情不?
点赞  2007-10-19 14:15
否。
当然能干其他的事情。
虽然是阻塞,虽然是同步,但是那是相对于子线程自己而言。
而对于主程序,肯定有个主线程,然后开出子线程,而主线程只关注子线程的生存。

请各位讨论。
点赞  2007-10-24 14:07
呵呵,你可以试一下咯,理论上应该不会阻塞,实际上呢,我以前就弄过.
点赞  2007-10-24 22:25
要具体问题具体分析.
1.先看你的驱动是不是是独占的,主要看IoCreateDevice

  1. NTSTATUS
  2.   IoCreateDevice(
  3.     IN PDRIVER_OBJECT  DriverObject,
  4.     IN ULONG  DeviceExtensionSize,
  5.     IN PUNICODE_STRING  DeviceName  OPTIONAL,
  6.     IN DEVICE_TYPE  DeviceType,
  7.     IN ULONG  DeviceCharacteristics,
  8.     IN BOOLEAN  Exclusive,
  9.     OUT PDEVICE_OBJECT  *DeviceObject
  10.     );

其中参数Exclusive为真,代表设备只能独占,也就是设备只能被一个进程打开,其他进程create这个设备的时候,返回句柄都是NULL
2.看你应用程序是怎么打开设备的。主要看CreateFile

  1. HANDLE CreateFile(
  2.   LPCTSTR lpFileName,                         // file name
  3.   DWORD dwDesiredAccess,                      // access mode
  4.   DWORD dwShareMode,                          // share mode
  5.   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
  6.   DWORD dwCreationDisposition,                // how to create
  7.   DWORD dwFlagsAndAttributes,                 // file attributes
  8.   HANDLE hTemplateFile                        // handle to template file
  9. );

dwShareMode是否FILE_SHARE_READ
3.看你的驱动对请求的irp如何支持的
如果是串行操作,也就是用startio,或者自己将irp做队列处理。如果一个线程正在处理一个irp,那么另一个线程,会请求一个新的irp,很有可能会pending在那里
4.看你的操作是否支持overlap
overlap模式可以很好的运行异步操作,overlap里会指定一个event,当操作成功后event被set
点赞  2007-10-25 10:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复