- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows多线程程序设计读书笔记 末
Windows多线程程序设计读书笔记 末
Windows不会贸然中断你的程序,然后调用你提供的这个callback函数,系统只有在线程说好,现在是安全时期的时候才调用你的callback函数,以Windows的说法就是,你的线程必须在所谓的alertable状态之下才行,如果有一个I/O操作完成但是线程不处于alertable状态,那么对I/O completion routine的调用就会暂时被保留下来。因此,当一个线程进入alertable转态时,可能已经有一大堆储备的APCs等待被处理。
如果线程因为以下函数而处于等待状态,而其alertable标记被设为TRUE,则该线程处于alertable状态。
lSleepEx lWaitForSingalObjectEx lWaitForMultipleObjectsEx lMsg WaitForMultipleObjectsEx lSignalObjectAndWait
只有当程序处于alertable状态时,APCs才会被调用这个观念很重要。
你所提供的I/O completion routine应该有这样的模式
VOID CALLBACK FileIOCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped
);
I/O completion routine需要一些东西以了解其环境,如果他不知道,I/O操作完成了什么,他就很难决定要做什么,使用ACPs时,OVERLAPPED结构中的hEvent栏位不需要用来放置event handle。Win32文件上说此时hEvent栏位可以由程序员自由运用,最大的用途就是:首先配置一个结构,描述数据来自哪里,或是要对数据进行些什么操作,然后将hEvent栏位设定指向该结构。
I/O完成端口
1.产生一个I/O completion port 2.让它和一个文件的handle产生关联
3.产生一堆线程
4.让每个线程都在completion port上等待
5.开始对着那些文件handle发出overlapped I/O请求;
当文件被开启后它们可以在任何时候与I/O completion port产生关联。
产生一个I/O completion port HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads
);
在一个I/O completion Port上等待
Worker线程初始化自己以后,应该调用GetQueuedCompletionStatus(),这个操作就像WaitForSingleObject()和GetOverlappedResult()的组合,函数规格如下:
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED*lpOverlapped,
DWORD dwMilliseconds
);
发出Overlapped I/O请求
下面这些调用可以启动能够被一个I/O completion port掌握的I/O操作:
uConnectNamePipe()
uDeviceIoControl()
uLockFileEx()
uReadFile();
uTransactNamePipe();
uWaitCommEvent()
uWriteFile()
为了使用completion port,主线程可以对着一个此completion port有关联的文件,进行读写或其他操作,该线程不需要调用waitformultipleobjects,因为池子里的线程都调用GetQueuedCompletionStatus()了,一旦I/O完成,一个等待中的线程就会被自动释放。
我需要保护数据吗?
以下情况需要保护数据
1.如果你不确定,或许你需要一个锁定
2.如果你在一个以上的线程中使用同一块数据,那么你必须保护他,使用一般而言包括读取、与之比较、写入、更新、改变或者任何其他操作,只要会用到变量名称都算
3.如果是一个基础类型,32位或者更小,并且是单独数据,那么你可以读它或者以值和他做比较,如果你需要改变他,请使用interlocked…()函数,你应该把变量声明为volatile。
4.如果你有许多数
您可能关注的文档
最近下载
- 汉语拼音教学讲座.pptx
- 2024-2030年中国工业分离筛分设备行业市场发展趋势与前景展望战略研究报告.docx
- 空间句法简明教程-20140903-01.pdf
- (高清版)DB45∕T 1625-2024 地质灾害危险性评估规程.pdf VIP
- 2023年(机械点检员)高级技能及理论综合知识考试题库与答案.pdf VIP
- 金融理财师AFP认证历年考试真题试题库(含答案).docx
- 《设施农业》课程标准.pdf
- 重庆主城排水工程可行性实施报告.pdf
- 2024浙江省温州市中考初三一模科学试题及答案.pdf VIP
- 2023小升初数学真题考点:图形与几何(复习)人教版六年级下册数学.pdf VIP
文档评论(0)