3949|6

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

子线程中调用DeviceIoControl, ReadFile, Writefile的问题 [复制链接]

请问
    子线程中调用DeviceIoControl或者ReadFile,WriteFile会不会阻塞主线程
    为什么呢

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

最新回复

要具体问题具体分析. 1.先看你的驱动是不是是独占的,主要看IoCreateDevice NTSTATUS   IoCreateDevice(     IN PDRIVER_OBJECT  DriverObject,     IN ULONG  DeviceExtensionSize,     IN PUNICODE_STRING  DeviceName  OPTIONAL,     IN DEVICE_TYPE  DeviceType,     IN ULONG  DeviceCharacteristics,     IN BOOLEAN  Exclusive,     OUT PDEVICE_OBJECT  *DeviceObject     ); 复制代码 其中参数Exclusive为真,代表设备只能独占,也就是设备只能被一个进程打开,其他进程create这个设备的时候,返回句柄都是NULL 2.看你应用程序是怎么打开设备的。主要看CreateFile HANDLE CreateFile(   LPCTSTR lpFileName,                         // file name   DWORD dwDesiredAccess,                      // access mode   DWORD dwShareMode,                          // share mode   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD   DWORD dwCreationDisposition,                // how to create   DWORD dwFlagsAndAttributes,                 // file attributes   HANDLE hTemplateFile                        // handle to template file ); 复制代码 dwShareMode是否FILE_SHARE_READ 3.看你的驱动对请求的irp如何支持的 如果是串行操作,也就是用startio,或者自己将irp做队列处理。如果一个线程正在处理一个irp,那么另一个线程,会请求一个新的irp,很有可能会pending在那里 4.看你的操作是否支持overlap overlap模式可以很好的运行异步操作,overlap里会指定一个event,当操作成功后event被set  详情 回复 发表于 2007-10-25 10:05
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
补充一下:

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

但是就算如此,是不是就一定意味着我的问题的答案是肯定的呢
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
非异步操作,肯定会阻塞主线程
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主写一个通信程序试一下,看看主程序还能干别的事情不?
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
否。
当然能干其他的事情。
虽然是阻塞,虽然是同步,但是那是相对于子线程自己而言。
而对于主程序,肯定有个主线程,然后开出子线程,而主线程只关注子线程的生存。

请各位讨论。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,你可以试一下咯,理论上应该不会阻塞,实际上呢,我以前就弄过.
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
要具体问题具体分析.
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
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表