线程同步的情景之一

从本篇文章开始,我将陆续介绍多线程中会遇到的三种情况。

情景一:此茅坑有主了

大锤:”我擦,居然一个茅坑有两个人在用。”

大锤:”啊,忍不住了,一起挤挤吧~~~”

叫兽:”舒坦了,先走了。”

叫兽按下了冲水开关…. “哗啦啦…..”

大锤:”你妹啊,冲什么水啊,冲得我一身 shit “

解决方案:为了解决这种混乱的情况,管理员给茅坑加了道门,一次只允许一个人使用,其他人只能在外面等待。而且只要有人占着,就算不拉屎,其他人也只能乖乖排队。

问题抽象:当某一资源可能同时被多个线程读取和修改时,资源的状态将变得难以预料。

线程同步方案:Interlocked、lock、Moniter、SpinLock、ReadWriteLockSlim、Mutex

方案特性:除所有者外,其他人无条件等待;先到先得(谁先进茅坑,谁先用,没有先后顺序)

各方案间的区别(关于如何使用每种方案,很多文章和书籍都有介绍,就不再一一赘述了。)

这些方案从它们各自的实现方式可分为三种:用户模式构造、内核模式构造 和 混合模式构造。

应该尽量使用用户模式构造,它们的速度要显著快于内核模式的构造。这是因为它们使用了特殊 CPU 指令来协调线程。这意味着协调是在硬件中发生的(所以才这么快)。它们有一个缺点:只有 Windows 操作系统内核才能停止一个线程的运行(以避免浪费 CPU 时间)。所以,一个线程想要取得一个资源但又暂时取不到,它会一直在用户模式中运行。这可能浪费大量 CPU 时间。
内核模式的构造是由 Windows 操作系统自身提供的。所以,它们要求你在应用程序的线程中调用在操作系统内核中实现的函数。将线程从用户模式切换为内核模式(或相反)会招致巨大的性能损失,这正是为什么应该避免使用内核模式构造的原因。然后,它们有一个重要的优点:一个线程使用一个内核模式的构造获取一个由其它线程拥有的资源时,Windows会阻塞线程,使它不再浪费 CPU 时间。然后,当资源变得可用时,Windows 会恢复线程,允许它访问资源。

Original: https://www.cnblogs.com/stg609/p/4050473.html
Author: stg609
Title: 线程同步的情景之一

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542108/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球