无锁数据结构设计 之 内存顺序实际表现

这是mhy12345的无锁数据结构教程的第四篇,在详解了C++内存顺序之后,谈谈C++内存顺序在实际运行中的一些影响。

从原理上出发看看C++内存顺序的含义:是由于计算机缓存等内存结构性质导致的线程间单原子变量读写互相不可见的情形。

不过,稍微仔细想想,发现这其实只是一种理论概率上的情形。

首先在考虑内存顺序的误差时,我们先举一个锁的例子——

锁,是为了防止线程之间的资源竞争,

假设一个线程在1%的时间需要独占某一个资源,两个没有加锁的线程产生了竞争导致程序崩溃的概率1%

则,在某一时刻,两个线程同时占有某资源且发生崩溃的概率应为10^{-6}

别看这概率很小,但是我们的程序是若干时点的概念,我们若将时点设为10^6个(这个数应该是有一段程序运行间线程期望切换次数决定的),则发生崩溃的概率为

    \[(1-10^{-6})^{10^6}-1 = 63%\]

因此我们发现,对于线程而言,加锁确实是必不可少的。

不过确实给我们一个提示:为什么我们一定要研究理论上那一丁点的小概率事件呢?假设我告诉你崩溃的概率只有10^-20,那我们还需不需要加锁呢?

我们在开始

 

原创文章地址:【无锁数据结构设计 之 内存顺序实际表现】,转载时请注明出处mhy12345.xyz

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据