41.3 原子性
所谓无锁编程,就是一组用来编写不显式使用锁的并发程序的技术。程序员转而依靠原语操作(由硬件直接支持)来避免小对象(通常是单一字或双字)的数据竞争(见41.2.4节)。不必忍受数据竞争的原语操作通常被称为原子操作(atomic operation),可用来实现高层并发机制,如锁、线程和无锁数据结构。
除了简单的原子计数器这一明显例外,无锁编程通常很复杂,最好留给专家使用。为了进行无锁编程,除了理解语言机制,还要详细了解特定的机器体系结构以及专门的实现技术。不要仅仅学习了本书就尝试无锁编程。无锁技术较之于锁机制的主要优势是不会发生典型的锁问题,如死锁和饿死。对每个原子操作,可保证即使有其他线程竞争访问原子对象,当前线程最终(通常很快)能继续前进。而且,无锁技术会比基于锁的替代方法快得多。
标准原子类型和原子操作提供了无锁代码传统表达方式之外的一种可移植的表达方式。它们通常依赖于汇编代码或系统相关的原语。从这个意义上说,标准对原子性的支持符合C和C++提高可移植性和系统编程支持力度的传统,是这一悠久传统迈出的新的一步。
同步操作用来确定线程何时看到另一个线程的执行效果;即,确定了哪些操作被认为是在另一些操作之前发生。在同步操作之间,编译器和处理器可自由重排代码顺序,只要语言的语义规则得以保持既可。原则上,并无人监控实现同步,只有性能受到一些影响。一个或多个内存位置上的同步操作包括消费操作、获取操作、释放操作或集后两者为一身(见iso.1.10)。
·对一个获取操作(acquire operation),其他处理器会在任何后继操作的效果之前看到其效果。
·对一个释放操作(release operation),其他处理器会在其效果之前看到每个前驱操作的效果。
·消费操作(consume ...
Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.