c – 与`std :: mutex`同步慢于`std :: atomic(memory_order_seq_cst)`?
作者:互联网
在互斥量上使用原子的主要原因是互斥量很昂贵,但是原子的默认内存模型是memory_order_seq_cst,这不是很贵吗?
问题:并发使用锁的程序可以和并发无锁程序一样快吗?
如果是这样,除非我想将memory_order_acq_rel用于原子,否则它可能不值得.
编辑:
我可能会遗漏一些东西,但基于锁定的速度比无锁更快,因为每个锁也必须是一个完整的内存屏障.但是,通过无锁,可以使用比内存障碍更少限制的技术.
那么回到我的问题,除了基于具有默认memory_model的新C 11标准的锁定之外,锁定是否更快?
“无锁定> =在性能测量时基于锁定”是真的吗?我们假设有2个硬件线程.
编辑2:
我的问题不是关于进度保证,也许我正在使用“无锁”脱离上下文.
基本上当你有2个带有共享内存的线程时,你需要的唯一保证就是如果一个线程正在编写然后另一个线程无法读取或写入,我的假设是简单的原子compare_and_swap操作比锁定a更快互斥.
因为如果一个线程甚至从未触及共享内存,您将无缘无故地反复锁定和解锁,但使用原子操作时,每次只使用1个CPU周期.
关于注释,当争用很少时,自旋锁与互斥锁是非常不同的.
解决方法:
Lockfree编程是关于进度保证:从最强到最弱,这些是无等待,无锁,无障碍和阻塞.
保证是昂贵的,而且是有代价的.您想要的保证越多,您支付的费用就越多.通常,阻塞算法或数据结构(例如,使用互斥体)具有最大的自由度,因此可能是最快的.另一个极端的无等待算法必须在每一步使用原子操作,这可能要慢得多.
获得锁定实际上相当便宜,所以如果不深入了解主题,就不应该担心.此外,使用互斥锁的阻塞算法更容易阅读,编写和推理.相比之下,即使是最简单的无锁数据结构也是长期专注研究的结果,每个研究都值得一个或多个博士学位.
简而言之,锁定或无等待算法会导致平均延迟和吞吐量的最差延迟.一切都比较慢,但没有什么比这更慢.这是一个非常特殊的特性,仅在非常特定的情况下(如实时系统)才有用.
标签:memory-model,compare-and-swap,c,c11,concurrency 来源: https://codeday.me/bug/20190930/1834621.html