c – 在关键部分,互斥锁和自旋锁之间进行选择

选择Critical Sections,Mutex和Spin Locks时要记住哪些因素?所有这些都提供了同步,但有什么具体的指导方针何时使用什么?

编辑:我的意思是Windows平台,因为它有一个关键部分的概念作为同步结构.

最佳答案
要考虑的一般要点:

>使用该机制的性能成本.
>使用该机制引入的复杂性.

在任何给定的情况下,1或2可能更重要.

例如.

如果您使用多线程通过使用许多内核来编写高性能算法并且需要保护一些数据以便安全访问,那么1可能非常重要.

如果您有一个应用程序,其中使用后台线程轮询定时器上的某些信息,并且在极少数情况下它会注意到更新,您需要保护一些数据以进行访问,那么2可能比1更重要.

1将归结为基础实现,并且可能与保护范围一致,例如进程内部的锁通常比跨机器上所有进程的锁更快.

2很容易误判.首次尝试使用锁来编写线程安全代码通常会遗漏一些导致死锁的情况.例如,如果线程A在线程B持有的锁上等待但线程B在线程A持有的锁上等待,则会发生简单的死锁.令人惊讶的是容易实现.

在任何给定的平台上,锁定机构的命名和质量可能会有所不同.

在Windows上,关键部分是快速且特定于进程的,互斥体较慢但是跨进程.信号量提供更复杂的用例.一些问题例如从池中分配可以使用原子函数而不是锁来非常有效地解决.在Windows上InterlockedIncrement确实非常快.

转载注明原文:c – 在关键部分,互斥锁和自旋锁之间进行选择 - 代码日志