线程的同步控制(Synchronization)
程序员文章站
2022-03-25 22:27:08
临界区(Critical Sections) 摘要 临界区(Critical Section) 用来实现“排他性占有”。适合范围时单一进程的各线程之间。 特点 一个局部对象,不是一个核心对象 快速而有效率 不能够同时有一个以上的Critical Section被等待 无法侦测是否已经被某个线程放弃 ......
-
临界区(Critical Sections)
-
摘要
- 临界区(Critical Section) 用来实现“排他性占有”。适合范围时单一进程的各线程之间。
-
特点
- 一个局部对象,不是一个核心对象
- 快速而有效率
- 不能够同时有一个以上的Critical Section被等待
- 无法侦测是否已经被某个线程放弃
-
相关函数
- 定义:CRITICAL_SECTION
- 初始化:InitializaCriticalSection()
- 进入:EnterCriticalSection()
- 离开:LeaveCriticalSection()
- 删除:DeleteCriticalSection()
-
死锁(deadlock)
- 任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁阴影。如哲学家进餐问题。
-
-
互斥器(Mutexes)
-
摘要
- Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至即使那些线程分属不同进程。
-
特点
- 一个核心对象
- 如果拥有Mutex的那个线程结束,则会产生一个“abandoned" 错误信息
- 可以使用Wait...() 等待一个或多个mutex
- 可以具名,因此可以被其他进程开启
- 只能被拥有它的那个线程释放
-
相关函数
- 定义:Mutex
- 产生:CreateMutex()
- 打开:openMutex()
- 等待(或进入):WaitForSigleObject()、WaitForMultipleObjects()、MsgWaitForMultipleObjects()
- 释放:ReleaseMutex()
- 删除:CloseHandle()
-
Mutex 和 Critical Section 对比
- 锁住一个未被拥有的Mutex,比锁住一个未被拥有的critical section,需要花费几乎100倍的时间。因为critical section 运行在usermode。
- Mutexes 可以跨进程使用个。Critical Section 只能够在同一个进程中使用
- 等待一个Mutex时,可以指定“结束等待”的时间长度。critical section则不行。
- Mutex可以设置同时等待多个,critical section只能等待一个
-
摘要
-
信号量(Semaphores)
-
摘要
- Semaphores被用来追踪有限的资源
-
特点
- 是一个核心对象
- 没有拥有者
- 可以具名,因此可以被其他进程开启
- 可以被任何一个线程释放
-
相关函数
- 产生:CreateSamaphore()
- 获取:WaitForSingleObject()、WaitForMultipleObjects()
- 解除:ReleaseSemaphore()
-
摘要
-
事件(Event)
-
摘要
- Event Object 通常使用于overlapped I/O,或用来设计某些自定义的同步对象
-
特点
- 是一个核心对象
- 完全在程序的掌握之下
- 适用于设计新的同步对象
- “要求苏醒”的请求并不会被存储起来,可能会遗忘掉
- 可以具名,因此可以被其他进程开启
-
相关函数
- 产生:CreateEvent()
- 激发:SetEvent()
- 复位:ResetEvent()
- 激发:PulseEvent()
-
激发函数比较
-
自动模式(Auto Reset Event):
- PulseEvent和SetEvent作用相同,调用后正在等候事件的,被挂起的单个线程会进入活动状态,事件随后设回无信号。
-
手动模式(Manual Reset Event):
- PulseEvent:调用后正在等候事件的,被挂起的单个线程会进入活动状态,事件随后设回无信号。
- SetEvent:调用后正在等候事件的,被挂起的所有线程会进入活动状态,需要等待ResetEvent调用才能将事件设回无信号。
-
自动模式(Auto Reset Event):
-
摘要
-
Interlocked Variable
-
摘要
- 如果Interlocked...() 函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此只外,Interlocked variable 主要用于引用计数。
-
特点
- 运行对4字节的数值有些基本的同步操作,不需动用critical section 或 Mutex 之类
- 在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作
-
相关函数
- 加一:InterlockedIncrement()
- 减一:InterlockedDecrement()
- 设值:InterlockedExchange
-
摘要
上一篇: 剑指offer55:链表中环的入口结点
下一篇: 4.MySQL索引原理