博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows核心编程-互斥器(Mutexes)
阅读量:6535 次
发布时间:2019-06-24

本文共 1075 字,大约阅读时间需要 3 分钟。

线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。

前边讲过了临界区线程同步-----,这章我来介绍一下互斥器(Mutexes)在线程同步中的使用。
互斥器(Mutexes)的用途和临界区(critical section)的用途非常相似,如:一个时间内只能够有一个线程拥有mutex,就好像同一时间内只能够有一个线程进入同一个critical section一样。但是mutex通过牺牲速度,提高了灵活性,功能变得更加强大了。
虽然mutex和critical section做相同的事情,但它们的运作还是有差别的:
1、锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section需要花费几乎100倍的时间。
2、mutex可以跨进程使用。critical section则只能在同一个进程中使用。

3、等待一个mutex时,你可以指定“结束等待”的世间长度,但对于critical section则不行。

造成以上差别的主要原因是:mutex是内核对象,critical section非内核对象。

以下是mutex和critical section的相关函数比较:

 

临界区 互斥器
CRITICAL_SECTION
InitializeCriticalSection()
CreateMutex()
OpenMutex()
EnterCriticalSection() WaitForSingleObject()
WaitForMultipleObjects()
MsgWaitForMultipleObjects()
LeaveCriticalSection() ReleaseMutex()
DeleteCriticalSection() CloseHandle()

使用mutex时注意:在一个适当的程序中,线程绝对不应该在它即将结束前还拥有一个mutex,因为这意味着线程没有能够适当地清除其资源。不幸的是,我们并不身处一个完美的世界,有时候,因为某种理由,线程可能没有在结束前调用ReleaseMutex()。为了解决这个问题,mutex有一个非常重要的特性。这性质在各种同步机制中是独一无二的,如果线程拥有一个mutex而在结束前没有调用ReleaseMutex(),mutex不会被摧毁,取而代之的是,该mutex会被视为“未被拥有”以及“未被激发”,而下一个等待中的线程会被以WAIT_ABANDONED_0通知。无论线程是因为ExitThread()而结束,或是因当掉而结束,这种情况都存在。

 

 

转载地址:http://mnbdo.baihongyu.com/

你可能感兴趣的文章
php 错误堆栈
查看>>
完全卸载删除gitlab
查看>>
给单元素艺术添加动画
查看>>
兼容测试1
查看>>
hack
查看>>
六、流程控制语句(选择包括switch,迭代语句即循环(搞明白为什么可以循环),跳转(break,continue,goto,return))...
查看>>
You need tcl 8.5 or newer in order to run the Redis test
查看>>
2.变量(2.1 2.2)
查看>>
初识java虚拟机——JVM
查看>>
《Pointers On C》读书笔记(第五章 操作符和表达式)
查看>>
【BZOJ1015】星球大战starwar
查看>>
EasyNet开源项目计划
查看>>
docker集群故障迁移
查看>>
【原创】实用API拾遗_持续更新
查看>>
springmvc小结(下)
查看>>
2、反射-Method&父类
查看>>
PHP函数microtime()
查看>>
CSS3梅花三弄特效
查看>>
jQuery Validation PlugIn
查看>>
input:-webkit-autofill 导致chrome的输入框背景颜色变成黄色
查看>>