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 .