原子指令:指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导致低性能往往是因为临界区过大(限制了并发度),或竞争过于激烈(上下文切换开销变得突出)