目录
前言
一、原子类型
二、锁
三、屏障
四、条件变量
五、其他工具
总结
前言
std::sync模块主要包含以下几类核心内容,原子类型、锁、屏障、条件变量、其它工具……
在做题的时候涉及到了相关知识点的掌握,就此记录
一、原子类型
原子类型是实现无锁并发的基础。它们保证操作是原子的,即不可分割,不会因为线程切换而中断。
AtomicBool: 布尔值的原子操作AtomicI8,AtomicI16,AtomicI32,AtomicI64,AtomicIsize: 有符号整数的原子操作AtomicU8,AtomicU16,AtomicU32,AtomicU64,AtomicUsize: 无符号整数的原子操作AtomicPtr: 指针的原子操作
二、锁
用于控制多个线程对共享资源的访问。
Mutex(互斥锁):最常用的锁。它保证同一时间只有一个线程可以访问数据。
它通过
lock()方法返回一个MutexGuard(智能指针),通过 RAII 机制在离开作用域时自动释放锁。
RwLock(读写锁):允许多个读取者或一个写入者。
适用于“读多写少”的场景,比
Mutex并发性更高,但逻辑更复杂
三、屏障
用于协调线程间的内存顺序,确保编译器和 CPU 不会进行非法的指令重排。
Barrier:阻塞一组线程,直到所有线程都到达了屏障点。
常用于确保所有线程都完成了某个阶段的计算后,再一起进入下一阶段。
OnceLock(在旧版本中是Once或lazy_static的替代品):用于实现全局的、只初始化一次的单例模式。
它可以安全地被多个线程同时访问,保证闭包只执行一次。
四、条件变量
用于线程间等待某个事件发生。
Condvar:通常与
Mutex配合使用。允许线程等待(挂起)一个条件,并在另一个线程发出通知(signal)或广播(broadcast)时唤醒。
五、其他工具
Arc(虽然定义在std::sync,但通常与Rc对应):Atomically Reference Counted(原子引用计数)。
它是线程安全的
Rc。允许多个线程共享同一个数据的所有权,通过原子操作增加或减少引用计数。
总结
很频繁出现的一个知识点