zoukankan      html  css  js  c++  java
  • 基元线程同步构造

    有两种基元构造:用户模式和内核模式。

    应该尽量使用基元用户模式构造,因为它的速度明显高于后者。这是因为他们使用特殊的CPU指令来协调线程,这意味着协调是在硬件中发生的。但是,这也意味着win32系统永远无法检测到一个线程在一个基元用户模式构造上阻塞了。除此之外这些CPU指令只是阻塞线程极短的一些时间。而缺点就是:只有win系统内核能停止一个线程(以避免CPU时间)。在用户模式中运行的线程可能被系统抢占,但线程会以最快速度再次调度。所以,想要取得一个资源但是又暂时取不到,一个线程会在一直在用户模式中运行。这可能大量浪费CPU时间。

    这使我们将目光转向基元内核模式构造。内核模式的构造是由win系统自身提供。所以他们要求你在应用程序中调用操作系统内核中实现的函数。将线程用用户模式转向内核模式(或相反)导致巨大性能损失。这正是避免使用内核模式构造的原因。但是他们有一个重要的优点:一个线程使用内核模型构造获取其他线程拥有的资源时,win会阻塞线程,使它不浪费CPU时间。然后当资源可用时,win会恢复线程,使它访问资源。

    对于一个在构造上等待的线程,如果拥有这个构造的线程一直不释放它,前者就可能一直阻塞,如果是一个用户模式的构造,线程将一直在一个CPU线程上运行,我们称之为“活锁”,如果这是一个内核模式构造,线程将一直阻塞,我们称为“死锁”。但在两者之间,死锁总是优于活锁,因为活锁既浪费CPU时间,又浪费内存,而死锁只浪费内存。

    而理想中的构造应该拥有两者的长处。也就是说,在没有竞争的情况下,这个构造应该快而且不会阻塞。但是,如果存在对构造的竞争,我希望他被操作系统内核阻塞。像这样的构造,确实存在,我们称之为混合构造。

    CLR的许多线程构造只围绕win32的“线程同步构造”的一些面向对象的类包装器而已。比较CLR线程就是win线程。

  • 相关阅读:
    Falsy Bouncer(算法)
    Check for Palindromes(算法)
    ecshop 修改模板可输出php代码
    ecshop显示所有分类树栏目
    ecshop首页调用评论及图片
    ECSHOP 商品评论条件修改——购买过该商品且只能评价一次(购买多少次能评价多少次)
    PS4破解
    Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
    Java中类方法与实例方法的区别
    Java中类及方法的加载顺序
  • 原文地址:https://www.cnblogs.com/PerfectBeauty/p/10284277.html
Copyright © 2011-2022 走看看