C++ std::atomic和std::mutex
创始人
2024-11-15 16:40:44
0

C++11 引入了两个重要的同步机制用于多线程编程:std::atomicstd::mutex。它们各自适用于不同的并发控制需求,并在实现和使用上有很大的不同。

1. 目的和用途

  • std::atomic:

    • 设计目的:为原子操作提供支持,保证对变量的操作(如加载、存储、增加、减少等)是原子的,无需锁。
    • 用途:适用于需要对单个变量进行并发访问并保持高性能的场景,如计数器、标志位等。
  • std::mutex:

    • 设计目的:提供互斥锁,用于保护共享资源,确保同一时刻只有一个线程可以访问某个资源。
    • 用途:适用于复杂的临界区保护,需要确保某个代码段在任何时刻只能被一个线程执行,如保护复杂数据结构、文件操作等。

2. 性能和开销

  • std::atomic:

    • 性能:通常比std::mutex更快,因为它利用了硬件提供的原子操作指令,操作开销相对较低。
    • 开销:几乎没有上下文切换和内核态开销,所有操作都是在用户态完成的。
    • 无锁特性:避免了锁竞争和线程阻塞,可以减少上下文切换的开销。
  • std::mutex:

    • 性能:相对较慢,因为涉及上下文切换和内核态的开销。
    • 开销:需要等待操作,存在线程阻塞的可能性,当线程数较多时容易产生竞争和死锁风险。
    • 锁竞争:多个线程竞争同一个锁时会导致性能下降。

3. 易用性和代码复杂度

  • std::atomic:

    • 易用性:相对简单,只需对变量进行原子操作。
    • 代码复杂度:适用于简单的变量操作,不适用于复杂的临界区保护。
  • std::mutex:

    • 易用性:相对复杂,需要显式地锁定和解锁。
    • 代码复杂度:适用于复杂的临界区保护,需要更仔细地管理锁的生命周期和作用范围,而且要小心避免死锁。

4.使用示例

++操作并不是一个原子操作,该操作分为三步:

  • load:将共享变量n从内存加载到寄存器中。
  • update:更新寄存器里面的值,执行+1操作。
  • store:将新值从寄存器写回共享变量n的内存地址。

多个线程在同一个进程内工作,共享进程的资源,线程本身只拥有线程id、寄存器、线程栈。

因此可能当线程1刚将n的值加载到寄存器中就被切走了,也就是只完成了++操作的第一步,而线程2可能顺利完成了一次完整的++操作才被切走,而这时线程1继续用之前加载到寄存器中的值完成剩余的两步操作,最终就会导致两个线程分别对共享变量n进行了一次++操作,但最终n的值却只被++了一次。

因此需要加锁或者原子类:

#include  #include  #include   std::atomic atomic_count(0); std::mutex mtx; int count = 0;  void atomic_increment() {     for (int i = 0; i < 1000; ++i) {         atomic_count++;     } }  void mutex_increment() {     for (int i = 0; i < 1000; ++i) {         std::lock_guard lock(mtx);         count++;     } }  int main() {     std::thread t1(atomic_increment);     std::thread t2(atomic_increment);     t1.join();     t2.join();     std::cout << "Atomic count: " << atomic_count << std::endl;      std::thread t3(mutex_increment);     std::thread t4(mutex_increment);     t3.join();     t4.join();     std::cout << "Mutex count: " << count << std::endl;      return 0; } 

5.使用场景

  • std::atomic:适用于简单的、需要高性能的原子变量操作。例如计数器、单一标志等。
  • std::mutex:适用于复杂的临界区保护,例如需要保护复杂的数据结构或资源的访问。

相关内容

热门资讯

透视私人局!小唐家乐园辅助器(... 透视私人局!小唐家乐园辅助器(辅助)外挂开挂辅助工具(有挂分析)-哔哩哔哩;致您一封信;亲爱小唐家乐...
七分钟科普!家乡大贰小程序靠谱... 家乡大贰小程序靠谱吗是一款专注玩家量身打造的游戏记牌类型软件,在家乡大贰小程序靠谱吗这款游戏中我们可...
7分钟科普!新超凡软件辅助(辅... 7分钟科普!新超凡软件辅助(辅助)原来真的有挂插件(曝光开挂软件);最新版2026是一款经典耐玩的益...
玩家必备科技!微乐脚本(辅助)... 玩家必备科技!微乐脚本(辅助)外挂开挂辅助工具(有挂辅助)-哔哩哔哩;1、超多福利:超高返利,海量正...
六分钟讲解!丽水跑得快辅助工具... 六分钟讲解!丽水跑得快辅助工具,新上游通用挂,德州论坛(有挂助手)-哔哩哔哩相信很多朋友都在电脑上玩...
第8分钟透视!福麻圈跑得快辅助... 第8分钟透视!福麻圈跑得快辅助功能(辅助)原来真的有挂工具(传授开挂平台);福麻圈跑得快辅助功能软件...
一起来讨论!旗圣麻将辅助(辅助... 一起来讨论!旗圣麻将辅助(辅助)外挂开挂辅助安装(发现有挂)-哔哩哔哩;1、很好的旗圣麻将辅助工具软...
六分钟发现!指尖辅助,汇友游戏... 六分钟发现!指尖辅助,汇友游戏辅助软件,玩家教你(有挂解密)-哔哩哔哩;无需打开直接搜索薇:1367...
第3分钟透视!新悠悠辅助(辅助... 第3分钟透视!新悠悠辅助(辅助)原来确实有挂软件(正品开挂神器);新悠悠辅助是一项新悠悠辅助软件透视...
分享一款!多乐找刺激辅助(辅助... 【福星临门,好运相随】;分享一款!多乐找刺激辅助(辅助)外挂辅助开挂安装(有挂方法)-哔哩哔哩;暗藏...