Skip to main content
  1. cpp/

7. 进阶C++

2 mins
Table of Contents

C++11原子操作与无锁编程
#

参考资料

深入解析现代C++中的原子(std::atomic)

  1. 无锁编程:将多条指令合并成了一条指令形成一个逻辑完备的最小单元,通过兼容CPU指令执行逻辑形成的一种多线程编程模型
  2. 实现方式:
    • 自旋锁
    • CAS:compare and swap
  3. ABA问题:
    • 例子:Natalie在等红灯的时候,由于回头管孩子,错过了绿灯,等她再回过头看信号灯的时候,又是红灯了。虽然中间信号灯发生了变化,但是Natalie却不知道
    • 解决方法:针对操作的数据加上一个原子操作的使用计数,在CAS执行前,先获取一下计数是否和之前一样,如不一样则说明数据已被修改
  4. std::atomic的实现方式
  5. c++11无锁队列 concurrentqueue

内存屏障
#


SIMD
#

  • SIMD是单指令多数据技术,目前Intel处理器支持的SIMD技术包括MMX、SSE以及AVX
  • 寄存器是高速存储部件,通常有32位或64位。如果能够把寄存器中的空间分成4个8位的空间,计算速度就得到了提升
  • 使用SIMD优化程序
  • parallel processing - CPU SIMD vs GPU SIMD? :GPU适合对大量数据应用完全相同的处理;CPU(通过流水线优化)更适合同时决策和执行多个不同的任务,并处理不断变化的输入和请求。

NUMA
#

  • 传统的SMP(对称多处理)系统中,计算机有一个由所有CPU共享的内存控制器
  • NUMA体系结构为可伸缩性限制,CPU系统被分割成多个节点,每个节点都有处理器和自己的内存,且一个节点中的所有处理器都对该节点中的内存具有同等的访问权
  • libnuma详解(A NUMA API for LINUX)

池化技术
#

池化技术-知乎

多线程_线程池 C++线程池

  • 优势:减少(线程、对象、连接)创建、销毁时的操作耗时
  • 线程池通常适合下面的几个场合:
    1. 单位时间内处理任务频繁而且任务处理时间短
    2. 对实时性要求较高;如果接受到任务后再创建线程,可能满足不了实时要求,因此必须采用线程池进行预创建
  • 对象池