2024年5月11日发(作者:)
. .
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数
据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开场。
一 临界区
临界区的使用在线程同步中应该算是比较简单,说它简单还是说它同后面讲到的其它
方法相比更容易理 解。举个简单的例子:比方说有一个全局变量〔公共资源〕两个线程都
会对它进展写操作和读操作,如 果我们在这里不加以控制,会产生意想不到的结果。假设
线程A正在把全局变量加1然后打印在屏幕上, 但是这时切换到线程B,线程B又把全
局变量加1然后又切换到线程A,这时候线程A打印的结果就不是程 序想要的结果,也
就产生了错误。解决的方法就是设置一个区域,让线程A在操纵全局变量的时候进展 加
锁,线程B如果想操纵这个全局变量就要等待线程A释放这个锁,这个也就是临界区的概
念。
二 互斥体
windows api中提供了一个互斥体,功能上要比临界区强大。也许你要问,这个东东
. v .
. .
和临界区有什么区别 ,为什么强大.它们有以下几点不一致:
al section是局部对象,而mutex是核心对象。因此像waitforsingleobject
是不可以等待临界区的。
al section是快速高效的,而mutex同其相比要慢很多
al section使用围是单一进程中的各个线程,而mutex由于可以有一个名字,
因此它是可以应用 于不同的进程,当然也可以应用于同一个进程中的不同线程。
al section 无法检测到是否被某一个线程释放,而mutex在某一个线程完毕之
后会产生一 个abandoned的信息。同时mutex只能被拥有它的线程释放。 下面举两个
应用mutex的例子,一个是程序只能运行一个实例,也就是说同一个程序如果已经运行了,
就不能再运行了;另一个是关于非常经典的哲学家吃饭问题的例子。
三 事件
事件对象的特点是它可以应用在重叠I/O〔overlapped I/0〕上,比方说socket编程
中有两种模型,一种是 重叠I/0,一种是完成端口都是可以使用事件同步。它也是核心对
象,因此可以被waitforsingleobje这些 函数等待;事件可以有名字,因此可以被其他进
程开启。
四 信号量
semaphore的概念理解起来可能要比mutex还难, 我先简单说一下创立信号量的函
数,因为我在开场使 用的时候没有很快弄清楚,可能现在还有理解不对的地方,如果有错
. v .
发布评论