多线程之同步机制摘要

来源:互联网 发布:小说无敌淘宝王 编辑:程序博客网 时间:2024/05/17 23:25

Win32多线程的同步有很多种方式,也有很多概念。可以看到实际编码的模式有很多类似。这可能导致使用上的选择问题。

以下就来讨论一下各种方式的特点和一些初学者不易明白的概念。

核心对象:我简单的解释就是handle,可以用CloseHanle函数关闭,可以使用WaitForSingleObjec/WaitForMutliObject。

对应的Critical section和Interlocked Variable就不是核心对象,但他们有个最大的优点就是开销比核心对象小,那么简单的应用应该优先使用这两个对象。

当你在代码段前需要两把锁的时候就要小心了,死锁啊,这时就应该使用核心对象了,使用WaitForMutliObject。

很多例子中都存在while(1)的写法(busy loop),这也是不好的方式,应该使用WaitFor...Object。(线程也有handle,也可以用此函数wait)。

Event要注意SetEvent和PulseEvent的区别

 

Win32多线程程序设计   侯捷译 中的描述

Critical Section
Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程
的各线程之间。
 一个局部性对象,不是一个核心对象。
 快速而有效率。
 不能够同时有一个以上的 critical section 被等待。
 无法侦测是否已被某个线程放弃。
Mutex
Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至即使那些线程分属不同进程。

 一个核心对象。
 如果拥有 mutex 的那个线程结束,则会产生一个 “abandoned” 错误信息。
 可以使用 Wait...() 等待一个 mutex。
 可以具名,因此可以被其他进程开启。
 只能被拥有它的那个线程释放(released)。
Semaphore
Semaphore 被用来追踪有限的资源。
 一个核心对象。
 没有拥有者。
 可以具名,因此可以被其他进程开启。
 可以被任何一个线程释放(released)。
Event Object
Event object 通常使用于 overlapped I/O(第6章),或用来设计某些自定
义的同步对象。它是:
 一个核心对象。
 完全在程序掌控之下。
 适用于设计新的同步对象。
 “要求苏醒”的请求并不会被储存起来,可能会遗失掉。
 可以具名,因此可以被其他进程开启。
Interlocked Variable
如果 Interlocked...() 函数被使用于所谓的 spin-lock,那么它们只是一种同步机制。所谓 spin-lock 是一种 busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用它们。除此之外,interlockedvariables 主要用于引用计数。
允许对 4 字节的数值有些基本的同步操作,不需动用到 criticalsection 或 mutex 之类。
在 SMP(Symmetric Multi-Processors)操作系统中亦可有效运作。