网站大量收购闲置独家精品文档,联系QQ:2885784924

Windows多线程程序设计读书笔记 末.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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.如果你有许多数

文档评论(0)

2017meng + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档