关闭

关闭

封号提示

内容

首页 Win32多线程程序设计.pdf

Win32多线程程序设计.pdf

Win32多线程程序设计.pdf

上传者: zzmgxzl 2012-05-12 评分1 评论0 下载490 收藏0 阅读量733 暂无简介 简介 举报

简介:本文档为《Win32多线程程序设计pdf》,可适用于IT书籍领域,主题内容包含Win多线程程序设计线程完全手册MultithreadingApplicationsinWinTheCompleteGuidetoThreadsJi符等。

Win多线程程序设计线程完全手册MultithreadingApplicationsinWinTheCompleteGuidetoThreadsJimBeveridgeRobertWiener著侯捷译译序侯捷thread就是“线”。台湾计算机术语采用“绪”这个译词“绪”就是“线”的雅称multithread就是“多绪”。大陆计算机术语采用“线程”一词multithread就是“多线程”。Threads(线程)是比processes(进程)更小的执行单元CPU的调度与时间分配皆以threads为对象。计算机领域中早就存在threads的观念和技术但是早期个人电脑操作系统(主要是DOS)别说multithread连multitask,multiuser亦不可得。因此从当时乃至延伸至今threads的概念和功能对许多非计算机专业科班出身者而言属于一种“崇高而难以亲近”的位阶对许多计算机专业科班出身者而言却又只是“操作系统”这门课里高高在上的一个名词。本书第一章第一句话值得玩味:“计算机工业界每有新的技术问世人们总是不遗余力地去担忧它是不是够重要。公司行号虎视眈眈地注意其竞争对手直到对方采用并宣扬这技术有多么重要才开始急急赶上。不论这技术是不是真的很重要每一个人都想尽办法让终端用户感觉真的很重要。终端用户终于真的觉得需要它了即使他们完全不了解那是什么东西。”threads大约就是这么一种东西吧。OS、WindowsNT、Windows这类“新一代PC操作系统”初上市时便一再强调其抢先式多任务(preemptivemultitasking)的多线程(multithreaded)环境。拜强势行销之赐霎时间线头到处飞舞高深的译序计算机术语在街巷里弄之间传播了开来颇有点“NeuralFuzzy”洗衣机的味道。这倒也算是好事!搞不清楚threads是什么对终端用户而言或许没有关系对技术人员可就不妙。Threads绝对可以缩短程序的执行时间吗?应该尽量多产生threads来帮助程序工作吗?任何种类的程序都可以获得multithreads的好处吗?错!错!错!似是而非的观念可能会把你的程序带往更坏(而非更好)的境界。Threads不是新东西但它借着Windows的庞大装机量初次广泛进入个人电脑世界带给个人电脑巨大的冲击。产生threads毫无困难要让它们分工容易而要让它们合作那可就得花相当多的心思。Threads不一定带来好处运用不当的话它会在执行效率上惩罚你。Threads是Win操作系统和Win程序设计不可或缺的重要环节每一本重量级Win程序设计书籍都不会忽略这个题目(请参考附录B)。但是这些书多半仅以一章(甚至只是一节)来介绍这个题目。不够真的不够我们缺乏一本兼具理论并重实际的threads专著。《MultithreadingApplicationsinWin》的内容兼具理论和实际轻薄短小的身形则在大部头书当道的今天让我们心情轻松。这是一本导入性书籍在threads专著里算是比较容易入门的。但是你必须知道threads不可能让你轻松学习!同步控制、多线程通讯、数据一致性……样样耗费你的心神考验你专心致志的程度。读这本书还请你武装一下自己的精神。对于中译本我有以下两点说明:译本内的程序实例直接取自书附光盘。如果与英文版书面代码稍有出入恐怕是因为作者直接在实际程序上做了点小变动而未能及时反应到书面。如果出现这种差异我会在程序代码列表之后以译注的方式告诉你。译本保留了相当多的原文技术术语主要是考虑本书的潜在读者层。如果不采用原文术语可能各位反而要倒译回去半看半猜那么译本的价值就适得译序其反了。许多地方我不厌其烦地在中文术语后面加上原文术语为的也是同样的原因。Multithreading非常重要。当支持多处理器(multiprocessor)的操作系统逐渐普及时具备多处理器的个人计算机也逐渐普及。我相信多线程程序设计是每一位技术人员都必须面对的技术。即便现在多线程能够提高多人、多任务程序的使用者接口(UI)反应度同样也是高阶技术人员应该追求的目标。侯捷新竹jjhoujjhoucomhttp:wwwjjhoucom(繁体中文)http:jjhoucsdnnet(简体中文)函数索引beginthreadLeaveCriticalSectionbeginthreadexMapViewOfFileAfxBeginThread,MsgWaitForMultipleObjectsCloseHandleMsgWaitForMultipleObjectsExCoInitializeExOpenFileMappingCreateEventPostThreadMessageCreateFileReadFileCreateFileMappingReadFileExCreateIoCompletionPortReleaseMutexCreateMutexReleaseSemaphoreCreateSemaphoreReplyMessageCreateThreadResumeThreadDeleteCriticalSectionSetThreadPriorityDisableThreadLibraryCallsSleepExDllMainSuspendThreadendthreadTerminateThreadendthreadexTlsAllocEnterCriticalSectionTlsFreeExitThreadTlsGetValueFileIOCompletionRoutineTlsSetValueGetExitCodeThreadUnmapViewOfFileGetQueuedCompletionStatusGetOverlappedResultGetStdHandleWaitForMultipleObjectsGetThreadPriorityWaitForMultipleObjectsExInitializeCriticalSectionWaitForSingleObjectInterlockedDecrementWaitForSingleObjectExInterlockedExchangeWriteFileInterlockedIncrementWriteFileEx常见问答集FrequentlyAskedQuestionsFAQ:合作型(cooperative)多任务与抢先式(preemptive)多任务有何不同?FAQ:我可以在Wins中使用多个线程吗?FAQ:线程和进程有何不同?FAQ:线程在操作系统中携带多少“行李”?FAQ:ContextSwitch是怎么发生的?FAQ:为什么我应该调用CloseHandle()?FAQ:为什么可以在不结束线程的情况下关闭其handle?FAQ:如果线程还在运行而我的程序结束了会怎样?FAQ:什么是MTVERIFY?FAQ:我如何得知一个核心对象是否处于激发状态?FAQ:什么是一个被激发的对象?FAQ:“激发”对于不同的核心对象有什么不同的意义?FAQ:我如何在主线程中等待一个handle?FAQ:如果线程在criticalsections中停很久会怎样?viii常见问答集(FrequentlyAskedQuestions)FAQ:如果线程在criticalsections中结束会怎样?FAQ:我如何避免死锁?FAQ:我能够等待一个以上的criticalsections吗?FAQ:谁才拥有semaphore?FAQ:Eventobject有什么用途?FAQ:如果我对着一个event对象调用PulseEvent()并且没有线程正在等待会怎样?FAQ:什么是overlappedIO?FAQ:OverlappedIO在Windows上有什么限制?FAQ:我能够以Cruntimelibrary使用overlappedIO吗?FAQ:OverlappedIO总是异步地(asynchronously)执行吗?FAQ:我应该如何为overlappedIO产生一个event对象?FAQ:ReadFileEx()和WriteFileEx()的优点是什么?FAQ:一个IOcompletionroutine何时被调用?FAQ:我如何把一个用户自定义数据传递给IOcompletionroutine?FAQ:我如何把C成员函数当做一个IOcompletionroutine?FAQ:在一个高效率服务器(server)上我应该怎么进行IO?FAQ:为什么一个IOcompletionports是如此特殊?FAQ:一个IOcompletionport上应该安排多少个线程等待?FAQ:为什么我不应该使用select()?FAQ:volatile如何影响编译器的最优化操作?FAQ:什么是ReadersWriterslock?FAQ:一次应该锁住多少数据?FAQ:我应该使用多线程版本的Cruntimelibrary吗?FAQ:我如何选择一套适当的Cruntimelibrary?FAQ:我如何使用beginthreadex()和endthreadex()?vii常见问答集(FrequentlyAskedQuestions)ixFAQ:什么时候我应该使用beginthreadex()而非CreateThread()?FAQ:我如何使用ConsoleAPI取代stdioh?FAQ:为什么我不应该使用beginthread()?FAQ:我如何以一个C成员函数当做线程起始函数?FAQ:我如何以一个成员函数当做线程起始函数?FAQ:我如何能够阻止一个线程杀掉它自己?FAQ:CWinApp和主线程之间有什么关系?FAQ:我如何设定AfxBeginThread()中的pThreadClass参数?FAQ:我如何对一个特定的线程调试?FAQ:如果一个新的线程使用了我的DLL我如何被告知?FAQ:为什么我在写DLL时需要小心所谓的动态链接?FAQ:为什么我在DllMain中启动一个线程时必须特别小心?FAQ:我如何在DLL中设定一个threadlocalstorage(TLS)?FAQ:declspec(thread)的限制是什么?FAQ:我应该在什么时候使用多线程?FAQ:我能够对既有程序代码进行多线程操作吗?FAQ:我可以在我的数据库应用程序中使用多线程吗?作者序年我参加了第二届MicrosoftProfessionalDevelopersConference当时Win首次对大量观众展示。这是一个重大的事件其中有许多蛊魅的新技术第一次亮相。观众不断地对展示的东西喝彩。当我看到这些新技术时我身上Unix的那一部分说“时候到了”而Windows的那一部分则是高呼“哈利路亚”。五年过去了好几版WindowsNT问世了。我愈是深入此书愈是了解年的那场盛宴之中我的了解是多么贫乏。我听过许多“睿智”的话比如“为MDI程序的每一个窗口准备一个线程”之类事实上根本是错误的。有些技术(诸如overlappedIO)很明显地被曲解了。当我钻研此书时我发现许多其他书籍和文章从头到尾描述了各式各样的Win函数却很少着墨在如何使用它们或如何搭配其他函数使用。某些函数例如MsgWaitForMultipleObjects()是Win程序的运转中心却几乎没有任何范例程序正确使用过它。在我所发现的文件给了我太多的挫败之后我决定尽可能以实务导向的方式完成此书如此一来你就能看到那些Win函数一起合作的情景。这本书的读者群很广Win和Unix上的程序开发者欲转移到Win或是有经验的Win程序开发者都是我的对象。你会发现一些不曾看过的问答例如“为什么beginthreadex()真的很重要”等等。程序范例从基本层面到同步机xixii作者序制到多线程COM和ISAPI应用程序都有。这是一本可以让你上手实验“Win线程”的书。我描述了基础观念如果你需要更理论性的知识你还得多看点其他资料。线程的大部分问题都已经被Dijkstra和Courtois那样的人在年前就解决掉了他们的论文直到今天还适用。如果你对那些只挑软柿子吃而故意忽略困难部分的书籍感到绝望我希望本书能够让你绝地逢生。某些章节是经过了长时间的实验、多篇相关文章(来自杂志、期刊、MicrosoftKnowledgeBase)的阅读、众多源代码的剖析之后萃炼而得。像“线程与Cruntime函数库以及MFC的关系”这种主题我保证你会从中获得许多闪亮的宝石。许多程序员对于线程是既期待又怕受伤害。Unix的人嘲笑它因为进程(process)看起来就已经不错了。Win的人也嘲笑它因为PeekMessage()也运作得很好嘛!我写这本书时首先认识的一个关键问题就是:如果有任何一个人在乎所谓的线程他为的是什么?如果你开发的是服务器(server)产品你就应该对线程深深在乎因为IOcompletionports使用它。IOcompletionports是唯一能够搭配Winsockets或namedpipes完成高效率IO的方法。请你“跑”到第6章看个明白(用“走”字显得太慢了)。如果你开发的是Web产品那么IIS(InternetInformationServer)的扩充软件也是靠多线程DLLs完成的。这种技术的背景观念散布于整本书而第章则告诉你如何施行那些观念。本书第一篇的程序是以C完成的C的分量很少。从第二篇开始我们就往C移动了。一如我在第9章所说C是大势所趋不论你是否使用MFC。如果你的C根基不稳我希望你特别注意一下第9章。作者序xiii谁应该读这本书凡是CC程序开发人员并有Windows程序设计经验(不论是Win或Win)企图对线程、核心对象、overlappedIOinWin获得更坚实之认识者本书就是针对你们而写的。本书谈的是API函数的使用、你会遭遇的问题以及Windows架构对其用途的影响。读过本书之后你将有能力分析哪里是线程可以发挥效用的地方哪里是你应该躲闪它们的地方。几乎整本书的重点都放在产生真正可用的程序上。神秘手法以及不安全的设计已经被我排除了。Unix程序员将会发现Win和Unix之间有着基础观念上的差异。本书架构本书的第一篇“上路吧线程”为你建立必要的基础包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途。有经验的Win程序员或许可以跳过这一部分。不过第6章所讨论的主题(诸如IOcompletionports)是非常重要的题目而且总的来说其文件非常贫乏。本书的第二篇“多线程程序设计的工具与策略”介绍Cruntime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行多线程、如何产生一个DLL、如何对多线程程序调试。这一部分的许多信息来自于我们的研究和实际经验。本书的第三篇“真实世界中的多线程应用程序”谈论如何组织一个程序使它有效支持多线程。本篇示范两个真实世界中的应用软件第一个是个freethreadedOLEautomationserver第二个是ISAPI程序是个IIS(InternetInformationServer)扩充软件示范如何和JET数据库交谈。xiv作者序关于范例程序整本书中我用了许多文本模式程序来示范观念。有些人不喜欢这种选择但我相信一个~行的程序绝对比一个有着消息循环、资源文件、窗口函数……并且超过行的Windows程序更能够集中读者的目光。读这本书你不会看到太多与用户界面相关的东西。我相信本书的范例程序以其目前的形态对你会比较有帮助。面对这些范例程序我使用了多方的错误检验。虽然这些检验导致程序代码看起来有些杂乱但是错误检验对于生产一个真正的应用软件很重要对于一本书也很重要。相关阅读有两样东西是任意时候你尝试写任意Win程序时应该要准备的。第一样东西是MicrosoftDeveloperNetwork。其光盘内含不可置信的巨量技术资料包括MicrosoftKnowledgeBase、编译器和Win的完整手册以及MicrosoftSystemsJournal。第二样东西是JeffreyRichter的一本卓越书籍:AdvancedWindowsNT:TheDevelopersGuidetotheWinAPIforWindowsNTandWindows(MicrosoftPress)。虽然其中遗漏了某些NT的新东西但其他方面非常有价值。译注:Jeffrey的书已出至第版名为AdvancedWindowsThirdEdition。它的小标题写着:forWindowsWindowsNT。目录函数索引(FunctionIndex)封面里常见问答集(FrequentlyAskedQuestions)vii第一篇上路吧线程第章为什么要“千头万绪”一条曲折的路与线程共枕为什么最终用户也需要多线程多任务Win基础ContextSwitchingRaceConditions(竞争条件)AtomicOperations(原子操作)线程之间如何通讯好消息与坏消息第章线程的第一次接触产生一个线程使用多个线程的结果核心对象(KernelObjects)线程结束代码(ExitCode)结束一个线程错误处理后台打印(BackgroundPrinting)成功的秘诀iii目录第章快跑与等待看似闲暇却忙碌(BusyWaiting)性能监视器(PerformanceMonitor)等待一个线程的结束叮咚:被激发的对象(SignaledObjects)等待多个对象在一个GUI程序中等待提要第章同步控制(Synchronization)CriticalSections(关键区域、临界区域)死锁(Deadlock)哲学家进餐问题(TheDiningPhilosophers)互斥器(Mutexes)信号量(Semaphores)事件(EventObjects)从Worker线程中显示输出InterlockedVariables同步机制摘要第章不要让线程成为脱缰野马干净地终止一个线程线程优先权(ThreadPriority)初始化一个线程提要第章OverlappedIO在你身后变戏法Win文件操作函数被激发的FileHandles被激发的Event对象异步过程调用(AsynchronousProcedureCallsAPCs)对文件进行OverlappedIO的缺点IOCompletionPorts目录iii对Sockets使用OverlappedIO提要第二篇多线程程序设计的工具与手法第章数据一致性(DataConsistency)认识volatile关键字ReferentialIntegrityTheReadersWritersLock我需要锁定吗?LockGranularity(锁定粒度)提要第章使用CRuntimeLibrary什么是CRuntimeLibrary多线程版本选择一个多线程版本的CRuntimeLibrary以CRuntimeLibrary启动线程哪一个好:CreateThread()抑或beginthreadex()?避免stdioh一个安全的多线程程序结束进程(Process)为什么你应该避免beginthread()提要第章使用C处理有问题的beginthreadex()函数原型以一个C对象启动一个线程建立比较安全的CriticalSections建立比较安全的Locks建立可互换(Interchangeable)的locks异常情况(Exceptions)的处理提要iv目录第章MFC中的线程在MFC中启动一个Worker线程安全地使用AfxBeginThread()的传回值在MFC中启动一个UI线程与MFC对象共处MFC的同步控制MFC对于MsgWaitForMultipleObjects()的支持提要第章GDI与窗口管理线程的消息队列消息如何周游列国GUI效率问题以Worker线程完成多线程版MDI程序多个上层窗口(TopLevelWindows)如何是好?线程之间的通讯NT的影子线程(shadowthread)关于“Cancel”对话框锁住GDI对象提要第章调试使用WindowsNT有计划地对付错误BenchTesting线程对话框运转记录(Logging)内存记号(MemoryTrails)硬件调试寄存器(HardwareDebugRegisters)科学方法提要目录v第章进程之间的通讯(InterprocessCommunication)以消息队列权充数据转运中心

类似资料

该用户的其他资料

鬼谷子无字天书.pdf

汇编程序指南.pdf

网络环境下的C语言编程技巧及实例.pdf

c语言SOCKEt编程指南.doc

C语言程序设计_现代方法.pdf

职业精品

精彩专题

中秋节除了赏月,你还想怎么过?

“仰头望明月,寄情千里光”,算算你有多久没回家了。庆幸这个中秋节赶上了国庆节,不用悲伤“故乡再无春夏,只有秋冬”,独自一人赏月,8天长假,回家一趟,妥妥的!

用户评论

0/200
    暂无评论
上传我的资料

精选资料

热门资料排行换一换

  • 飞行合格(部队6通俗读物)50年…

  • 红岩启示录.pdf

  • 悲壮的红岩.pdf

  • 《小城小县》作者:秦人秦鬼.txt

  • Essential Skills…

  • 法网难逃(福建人民出版社 198…

  • 定位.pdf

  • 动物高蛋白—无菌蝇蛆养殖法.pdf

  • 高等学校学生及家庭情况调查表.p…

  • 资料评价:

    / 445
    所需积分:0 立即下载

    意见
    反馈

    返回
    顶部