Raa*_*aam 5 c++ multithreading
选择Critical Sections,Mutex和Spin Locks时要记住哪些因素?所有这些都提供了同步,但有什么具体的指导方针何时使用什么?
编辑:我的意思是Windows平台,因为它有一个关键部分的概念作为同步结构.
在 Windows 中,临界区是自旋锁和非忙等待的混合体。它会旋转一小段时间,然后——如果它还没有获取资源——它会设置一个事件并等待它。如果对资源的争用较少,则自旋锁行为通常就足够了。
对于不需要担心与其他进程共享资源的多线程程序来说,临界区是一个不错的选择。
互斥锁是一种很好的通用锁。命名互斥锁可用于控制多个进程之间的访问。但是使用互斥锁通常比使用临界区要贵一些。
需要考虑的一般要点:
在任何特定情况下,1 或 2 可能更重要。
例如
如果您使用多线程通过使用多个核心来编写高性能算法,并且需要保护一些数据以进行安全访问,那么 1 可能非常重要。
如果您有一个应用程序,其中后台线程用于轮询计时器上的某些信息,并且在极少数情况下它会注意到更新,您需要保护某些数据以供访问,那么 2 可能比 1 更重要。
1 将深入到底层实现,并且可能会随着保护范围而扩展,例如进程内部的锁通常比机器上所有进程的锁更快。
2.容易误判。第一次尝试使用锁来编写线程安全代码通常会错过一些导致死锁的情况。例如,如果线程 A 正在等待线程 B 持有的锁,而线程 B 正在等待线程 A 持有的锁,则会发生简单的死锁。意外地很容易实现。
在任何给定平台上,锁定机制的命名和质量可能会有所不同。
在 Windows 上,关键部分速度很快且特定于进程,互斥体速度较慢但跨进程。信号量提供了更复杂的用例。一些问题,例如从池中分配,可以使用原子函数而不是锁来非常有效地解决,例如在 Windows InterlockedIncrement 上,这确实非常快。
| 归档时间: |
|
| 查看次数: |
11601 次 |
| 最近记录: |