这是mhy12345的无锁数据结构教程的第四篇,在详解了C++内存顺序之后,谈谈C++内存顺序在实际运行中的一些影响。
从原理上出发看看C++内存顺序的含义:是由于计算机缓存等内存结构性质导致的线程间单原子变量读写互相不可见的情形。
不过,稍微仔细想想,发现这其实只是一种理论概率上的情形。
首先在考虑内存顺序的误差时,我们先举一个锁的例子——
锁,是为了防止线程之间的资源竞争,
假设一个线程在1%的时间需要独占某一个资源,两个没有加锁的线程产生了竞争导致程序崩溃的概率1%
则,在某一时刻,两个线程同时占有某资源且发生崩溃的概率应为
别看这概率很小,但是我们的程序是若干时点的概念,我们若将时点设为个(这个数应该是有一段程序运行间线程期望切换次数决定的),则发生崩溃的概率为
因此我们发现,对于线程而言,加锁确实是必不可少的。
不过确实给我们一个提示:为什么我们一定要研究理论上那一丁点的小概率事件呢?假设我告诉你崩溃的概率只有,那我们还需不需要加锁呢?
我们在开始