waitforsingleobject的作用_效率理论

waitforsingleobject的作用_效率理论MicrosoftWindows平台中两种最常用的锁定方法为WaitForSingleObject和EnterCriticalSection。WaitForSingleObject是一个过载MicrosoftAPI,可用于检查和修改许多不同对象(如事件、作业、互斥体、进程、信号、线程或计时器)的状态。WaitForSingleObject的一个不足之处是它会始终获取内核的锁

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Microsoft Windows 平台中两种最常用的锁定方法为 WaitForSingleObject EnterCriticalSectionWaitForSingleObject 是一个过载 Microsoft API ,可用于检查和修改许多不同对象(如事件、作业、互斥体、进程、信号、线程或计时器)的状态。Wa itForSingleObject 的一个不足之处是它会始终获取内核的锁定,因此无论是否获得锁定,它都会进入特权模式 ( 环路 0) 。此 API 还进入 Windows 内核,即使指定的超时为 0 ,亦如此。此锁定方法的另一不足之处在于,它一次只能处理 64 个尝试对某个对象进行锁定的线程。WaitForSingleObject 的优点是它可以全局进行处理,这使得此 API 能够用于进程间的同步。它还具有为操作系统提供锁定对象信息的优势,从而可以实现公平性及优先级倒置。

通过对关键代码段实施 EnterCriticalSection LeaveCriticalSection API 调用,可以使用 EnterCriticalSection 。此 API 具有 WaitForSingleObject 所不具备的优点,因为只有存在锁定争用时,才会进入内核。如果不存在锁定争用,则此 API 会获取用户空间锁定,并且在未进入特权模式的情况下返回。如果存在争用,则此 API 在内核中所采用的路径将与 WaitForSingleObject 极其相似。 在低争用的情况下,由于 EnterCriticalSection 不进入内核,因此锁定开销非常低。

不足之处是 EnterCriticalSection 无法进行全局处理,因此无法为线程获取锁定的顺序提供任何保证。EnterCriticalSection 是一种阻塞调用,意味着只有线程获得对此关键区段的访问权限时,该调用才会返回。Windows 引入了 TryEnterCriticalSection TryEnterCriticalSection 是一种非阻塞调用,无论获得锁定与否都会立即返回。此外,EnterCriticalSection 还允许开发人员使用自旋计数对关键区段进行初始化,在回退前线程会按此自旋计数尝试获取锁定。通过使用 API InitializeCriticalSectionAndSpinCount ,完成初始化。自旋计数可以在此调用中进行设置,也可以在注册表中进行设置,以根据不同操作系统及其相应的线程量程对自旋进行更改。

如果存在锁定争用,则 EnterCriticalSection WaitForSingleObject 都会进入内核。如果实现程度过高,从用户模式到特权模式的转换开销将会非常大。

EnterCriticalSection
WaitForSingleObject API 调用在对使用数千个周期的运算进行锁定时,通常不会影响性能。在这些情况下,锁定调用本身的开销不会如此突出。会导致性能降低的情况是粒度锁定,获得和释放此锁定要花费数百个周期。在这些情况下,使用用户级别锁定则非常有益。

为了说明在低争用的情况下 WaitForSingleObject 调用与 EnterCriticalSection 调用的开销情况,我们分别在 1 个和 2 个线程上运行了内存管理锁定内核 。在低争用的情况下,存在加速比 (WaitForSingleObject_Time / EnterCriticalSection_Time) 大约为 5 倍的性能之差。在 2 个线程持续争用的情况下,使用 EnterCriticalSection 和使用 WaitForSingleObject 之间的差别最小。在低争用的情况下存在性能差距的原因如下:WaitForSingleObject 在每次调用时都进入内核,而 EnterCriticalSection 只有当存在锁定争用时,才进入内核。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191619.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java学习电子书大全「建议收藏」

    Java学习电子书大全「建议收藏」声明:以下内容仅供学习交流,转载自沉默王二gitee,如有侵权联系作者删除。简单说一下我为什么要花半个多月的时间来整理这份书单。主要是因为很多读者的知识体系是零散的,不成系统的,况且技术书籍这么庞杂。有了我这份清单之后,那些没有经验或者经验有限的初学者,在学习的时候思路瞬间就开阔了许多:少走弯路,利用有限的精力,更加高效地学习。想应聘初级Java工程师,那只需要阅读入门、工具、框架和数据库方面的书籍就行了;如果想应聘Java高级工程师,那么就需要阅读并发编程、底层、性能优化方面的书籍

    2022年7月7日
    71
  • 数据库查询语句中的排序函数_数据库按照升序排列的语句

    数据库查询语句中的排序函数_数据库按照升序排列的语句1.排序查询语法排序查询语法:select*from表名orderby列1asc|desc[,列2asc|desc,…]语法说明:先按照列1进行排序,如果列1的值相同,则按照列2排序,以此类推asc从小到大排序,即升序desc从大到小排序,即降序默认按照从小到大排序(即asc关键字)举例:–查询未删除男生信息,按学号降序select*fromstudentswhereis_del=0andgender=’男’orderbyid

    2022年9月7日
    0
  • stringstream的用法如何会出现-1为ffff的情况_string读取文件指定长度

    stringstream的用法如何会出现-1为ffff的情况_string读取文件指定长度【本文来自】http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/10/27823.html使用stringstream对象简化类型转换C++标准库中的提供了比ANSIC的更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库

    2022年5月3日
    69
  • 历史上最著名计算机病毒,似乎都成了我们的回忆[通俗易懂]

    点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达来源:太原锦华计算机学校Windows勒索病毒似乎让全球计算机用户都闻风丧胆,不过这其实真的不算什么。然而令人始…

    2022年4月14日
    40
  • phpstrom 2021.4.14 激活码_通用破解码

    phpstrom 2021.4.14 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    55
  • 正则表达式常见用例

    正则表达式常见用例

    2022年3月12日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号