前面讲述了如何使用关键代码段。

但是关键代码段还有一些不为人知的秘密,也是多数程序员忽略的东西,特别是在多核cpu上面,我们必须知道的东西。

下面是《windows核心编程》这本书里面的一段话。插一句话,搞windows编程的此书必看,本人正在读中,感觉就是醍醐灌顶!

当线程试图进入另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。这意
味着该线程必须从用户方式转入内核方式(大约1 0 0 0个C P U周期)。这种转换是要付出很大代
价的。在多处理器计算机上,当前拥有资源的线程可以在不同的处理器上运行,并且能够很快
放弃对资源的控制。实际上拥有资源的线程可以在另一个线程完成转入内核方式之前释放资源。
如果出现这种情况,就会浪费许多C P U时间。

我们知道了,为什么要了解多核cpu关键代码段的秘密。

为了提高关键代码段的运行性能, M i c r o s o f t将循环锁纳入了这些代码段。因此,当
E n t e r C r i t i c a l S e c t i o n函数被调用时,它就使用循环锁进行循环,以便设法多次取得该资源。只
有当为了取得该资源的每次试图都失败时,该线程才转入内核方式,以便进入等待状态。

我们只需要将

InitializeCriticalSection(&cs[0]);

改为

InitializeCriticalSectionAndSpinCount( &cs[0] , 4000 );

就可以了 。

第一个参数不变,第二个参数为请求次数上限(范围是 0 ~  0x00FFFFFF),若达到了上限还是没有获得资源的时候,线程这个时候才从  用户方式进入内核方式(这就是浪费了CPU时间)。

如果我们想改变次数可以用下面函数

SetCriticalSectionSpinCount( &cs[0] , 6000 );

以上红色字体均是来自于windows核心编程。

线程同步--关键代码段(三)相关推荐

  1. 线程同步--关键代码段(一)

    线程同步有四种方式 但是在一个进程中,效率最高的,方式是 :关键代码段 #include <iostream> #include <windows.h> #include &l ...

  2. 线程同步--关键代码段(二)

    在我们接触到的多线程书籍里面,提到最多的就是线程同步问题了. 但是,我们看到最多的例子也是对一个临界资源的访问. 但是当我们自认为感觉靴子很好的时候,问题出现了,怎么才能够使我们让线程按照一定的顺序访 ...

  3. Windows编程-- 用户方式中线程的同步---关键代码段(临界区)

    可以从例子学习,更好的掌握 #include <windows.h> #include <iostream.h> //两个线程的声明 DWORD WINAPI Fun1Proc ...

  4. VC++中多线程学习(MFC多线程)三(线程同步包含:原子互锁、关键代码段、互斥器Mutex、Semaphores(信号量)、Event Objects(事件))

    目录 ​​​​​​​​​​​​ 线程同步的必要性: 2.解决同步问题的方法 2.1原子互锁家族函数 2.2Critical Sections(关键代码段.关键区域.临界区域) 2.3 互斥器Mutex ...

  5. 线程同步之关键代码段

    关键代码段: 1) 关键代码段(临界区)工作在用户方式下. 2) 关键代码段(临界区)是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权. 用InitializeCriticalSect ...

  6. 【Window】线程同步方式1——临界区(关键代码段)

    第一节:[Window]创建线程的3种方式 第二节:[Window]线程同步概述 第三节:[Window]线程同步方式1--临界区(关键代码段) 第四节:[Window]线程同步方式2--互斥量 第五 ...

  7. 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份

    摘要 开发者有时创建的多线程程序会生成错误值或产生其它奇怪的行为.古怪行为一般出现在一个多线程程序没使用同步连载线程访问关键代码部份的时候.同步连载线程访问关键代码部份是什么意思呢?在这篇文章中解释了 ...

  8. 秒杀多线程第五篇 经典线程同步 关键段CS

    上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...

  9. 互斥对象与关键代码段的比较

    9.6.2 互斥对象与关键代码段的比较 就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性.但是它们在其他属 性方面却各不相同.表 9 - 1 对它们进行了各方面的比较. 表 9-1 互斥对 ...

最新文章

  1. c语言如何输出整串链表,大神帮我看一下怎么输入输出一个链表,我输入了但是没输出啊...
  2. dubbo开发环境和生产环境搭建
  3. VMware桌面虚拟化在学校机房的应用
  4. Microsoft Visual Studio Learning Pack 2.0
  5. 《系统集成项目管理工程师》必背100个知识点-86项目总结会议讨论的内容
  6. cc2530dma控制器功能_CC2530常用的控制寄存器
  7. C# 实现SQLServer数据库备份示例
  8. 查找出系统中大于50k 且小于100k 的文件并删除。
  9. nginx fastcgi python_webpy + nginx + fastcgi 构建python应用
  10. C# 注册表控制++ Autorun after windows
  11. 问题 E: 求1+2+...+n=?
  12. 查找命令find和其他常用查找命令
  13. html5开发桌面程序调用dll,使用Visual Studio开发Html5应用
  14. 20个使用 Java CompletableFuture的示例,不服不行
  15. 《5K入门级项目实战:好来屋在线影院》之第 6 战 —— 添加电影信息、CKEditor富文本编辑器、SpringBoot 加载本地文件
  16. 【故障处理】ORA-12162: TNS:net service name is incorrectly specified
  17. 两个文件行合并linux,linux 两个文件合并
  18. 压缩文件压缩率是什么意思
  19. word里文字竖向排列(设置竖排文字)
  20. 75 [backtrader期货策略]十大经典策略-分时均线交叉策略

热门文章

  1. 老师使用计算机给小孩子上课,“某某中学教师课堂教学现状”调查问卷
  2. 三星 android 截屏,三星S7怎么截屏 3种三星S7截图方法
  3. 华为鸿蒙系统发展时间2021年,耗时八年打造国产系统,华为鸿蒙OS质疑声不断,它才是真正未来...
  4. mysql uroot p 报错,MySQL链接错误集。
  5. 计算机专业基础融合,【计算机专业论文】计算机专业产教融合转型发展模式探析(共2546字)...
  6. php多维数组key交换,php 根据key计算多维数组的和功能实例
  7. CentOS7:搭建SVN + Apache 服务器
  8. 玩转matlab之一维 gauss 数值积分公式及matlab源代码
  9. 【译】用 JavaScript 和 Emoji 做地址栏动画
  10. 多线程生成的原因(Java内存模型与i++操作解析)