zoukankan      html  css  js  c++  java
  • atomic

    原子指令:指cpu的执行单元,不会因其他信息被打断。

    多核编程注意点:

      race condition:多线程共同修改同一个cacheline

      ABA problem:一个线程两次读取一个cacheline值不变,但再第二次读取之前,有一个线程执行更改其值,执行其他工作,然后将其值改回来,欺骗第一个线程,值没发生变化

      memory fence:Memory barrier,现代cpu使用性能优化,可能会导致指令乱序执行。c++11 std::atomic提供支持

    thread 1
    p.init();
    ready= true;
    
    thread 2
    if (ready)
        p.do();
    //p.init()可能被cpu排序在ready=true后

      cacheline:变量按访问的规律排序,频繁访问变量应对齐cacheline,且尽量独立一个cacheline。或者各线程拥有TLS,在需要时再合并所有线程中的值

      spurious wakeup:在多线程情况下,一个条件变量似乎发出信号,但等待条件可能仍然为false

      wait-free:不管os如何调度线程,每个线程都始终在做有用的事

      lock-free:不管os如何调度线程,至少有一个线程在做有用的事

      mutex并不一定比wait-free或者lock-free慢,代码越多,时长就越长,mutex出现竞争时会使调用者睡眠,使拿到锁的那个线程可以很快独占完成一系列流程,总体吞吐可能反而高。mutex导致低性能往往是因为临界区过大(限制了并发度),或竞争过于激烈(上下文切换开销变得突出)

      

  • 相关阅读:
    Matplotlib使用笔记
    python之enumerate
    初识matlab
    动态规划的解题思路是如何形成的
    【JVM】体系结构及其细节
    位运算的题目小结
    【JUC】死锁的实现及其定位分析
    【JUC】如何理解线程池?第四种使用线程的方式
    【JUC】实现多线程的第三种方式Callable
    可怜的实验鼠和小猪问题
  • 原文地址:https://www.cnblogs.com/Call-C/p/8360237.html
Copyright © 2011-2022 走看看