多线程高效访问共享资源.docx

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多线程咼效访冋共享资源 BY懒牛 一、 多线程访问共享资源需注意的问题: 1、 多个线程如果在一个进程内,可共享进程内的资源。 2、 多个线程在不同的进程内,不同进程的资源不能直接共享,要用到内存映射文件。 3、 访问方式是用户方式还是内核方式,用户方式速度快,内核方式速度慢。 二、 用户方式和内核方式的区别: 1、 书上说的用户方式有互锁函数, CRITICAL_SECTION 关键代码段,内核方式有信标、 事件、互斥量。但是关键代码段也不是完全的用户方式,当一个线程进入关键代码段访问资源, 另一个线程是进入内核方式等待的。也是很费时间。经过理解, 我认为:用户方式是指当一个线 程占有资源时,另外的线程是以什么方式在等待。 2、 平常让程序等待的方式有三种,一种是让程序不断的条件循环,当条件达到时,退出。 这是最标准的用户方式,依靠循环浪费时间来等待,没用到内核。第二种用 sleep()函数,这个不 太好用条件控制,本质上也是内核方式。第三种就是内核的 Waitfor…..之类的等待函数了。 3、 从浪费时间的程度上来看,要分 CPU是单核还是多核的,如果是单核的,用户方式的 条件循环最浪费时间, 因为单核时循环要不断的在几个线程上下文切换特浪费时间; 内核方式其 次,所以在单核情况下,我们多线程访问资源,就直接用内核方式就 OK 了。在多核方式下情况 有变化,一个线程在第一个 CPU上访问资源时,另一个线程可以使用第二个 CPU来在用户方式 下做条件循环来判断是否能够访问资源了。多核方式下是真正的并发访问,二个线程同时运行, 不用做上下文切换。如果这种访问资源的时间用时很短, 比如说:一个线程只是在资源上做一个 简单运算就离开,则另一个线程在几个用户循环的判断时间就能够访问资源了, 何苦要进入内核 方式呢?所以在对共享资源访问时,我们先在用户方式下做几个循环来判断,如果能访问了, OK进行访问,如果循环到一定时间,还是不能访问资源,说明这种资源的访问很费时间,在用 户方式下继续做循环不合算了,我们就换成内核方式,让系统去帮我等待去吧, 我们不管了,哈 哈! 三、 多线程访问共享资源总结如下: 1、 单核时直接进入内核方式等待,等待成功则访问资源。 2、 多核时先在用户方式下做循环不断的询问是否能访问, 到达一定循环次数,如果条件满 足则访问,如果到循环最大值仍然不能访问,则我们也不浪费时间,直接转内核方式等待。 WINDOWS核心编程中为高效访问共享资源, 编制了 COptex类,使用这个类建立的对象就 是多个线程要访问的共享资源,下面让我们来详细分析一下: 表1-1成员变量描述 成员 描述 m _ l L o c k C o u n t 当线程调用enter()想进入o p t e x的时侯。如果线程进入了,则 此变量加1,同时 m _ l R e c u r s e C o u n t 变量也加1,如果没 有进入,则此变量加1,但是 m _ l R e c u r s e C o u n t 变量不加 1,总之它的意思是线程试图进入的次数,从这个变量可以判断, 还有多少线程还在等待进入。此值为0,说明 optex对象无人拥有, 可以进入。 m _ d w T h re a d I d 指明当前拥有o p t e x的线程的唯一 1 D。如果没有线程拥有 o p t ex,那么这个值是 0 m _ l R e c u r s e C o u n t 指明线程拥有op t e x的次数。如果o p t e x没有被线程所拥有, 则这个值是0,—个线程能多次进入拥有 optex,但是离开时要注意, 进入了几次,则也要离开几次,即调用几次 en ter(),配对调用 leave() m _ h e v t 这是个事件内核对象的句柄,只有当一个线程试图在另一个线程拥 有o p t e x 时,想在内核方式下进入该 o p t e x ,才使用这个句 柄。内核对象句柄是与进程相关的句柄,这就是该成员为什么不使 用S H A R E D I N F O 结构的原因 m _ d w S p i n C o u n t 指明试图进入o p t e x的线程在等待事件内核对象之前应该尝试在 用户方式下进入的次数。在单处理器计算机上,这个值总是0,也就 是说,单核方式不用试,直接用内核方式。 m _ h f m 这是文件映象内核对象的句柄,当多进程共享一个 o p t ex 时, 便使用这个句柄。内核对象句柄属于与进程相关的句柄,这就是为 什么该成员不是 S HAR E D I N F O 结构的原因。对于单进程 o p t e x 来说,这个值总是 N U L L m _ p s i 这是指向潜在的共享 op t e x 数据成员的

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档