- cpp/
7. 进阶C++
2 mins
Table of Contents
C++11原子操作与无锁编程#
- 无锁编程:将多条指令合并成了一条指令形成一个逻辑完备的最小单元,通过兼容CPU指令执行逻辑形成的一种多线程编程模型
- 实现方式:
- 自旋锁
- CAS:
compare and swap
- ABA问题:
- 例子:Natalie在等红灯的时候,由于回头管孩子,错过了绿灯,等她再回过头看信号灯的时候,又是红灯了。虽然中间信号灯发生了变化,但是Natalie却不知道
- 解决方法:针对操作的数据加上一个原子操作的使用计数,在CAS执行前,先获取一下计数是否和之前一样,如不一样则说明数据已被修改
std::atomic
的实现方式- 基于硬件的 原子指令
- 使用锁机制
- 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)
池化技术#
- 优势:减少(线程、对象、连接)创建、销毁时的操作耗时
- 线程池通常适合下面的几个场合:
- 单位时间内处理任务频繁而且任务处理时间短
- 对实时性要求较高;如果接受到任务后再创建线程,可能满足不了实时要求,因此必须采用线程池进行预创建
- 对象池