C++并发编程实战(C++ Concurrency in Action)中文第2版

  • 更新时间:
  • 8162人关注
  • 点击下载

这是一个不错的C++编程类学习资源,由石逸仙提供,主要知识点是关于C++、并发编程、C++实战、C++编程、C++编程的内容,已被932人关注,同类资源中评分为9.2分。

作为对《C++ Concurrency in Action - SECOND EDITION》的中文翻译。

C++并发编程实战第二版根据C++14和C++17标准进行更新和修订,涵盖了所有标准中最新的改动!本次修订版所要解答的问题是,如何用C++17写出优雅且健壮的多线程应用,并告诉你所有的细节!

技术方面

当需要应用有足够快的运行速度的时候,您应该选择C++。设计良好的C++并发程序将会充分利用资源,并运行的更快。C++17可以使用多线程或多处理器,使得图像处理、机器学习等性能敏感型任务更加快速的完成。本书特别为工业级C++并发解锁了相应的特性、模式和最佳实践方式。

关于本书

C++ Concurrency in Action, Second Edition可以作为C++在编写优雅多线程应用方面的权威指南。并更新了C++17的相关内容,其详细描述了并行开发的各个方面,从启动新线程到设计复杂的多线程算法和数据结构。每一章中并发大师Anthony Williams都为你提供了示例和一些练习,也包括一些独到的见解,这对于开发经验丰富人员来说可能是非常有兴趣的。

内容概述

对C++17特性全面覆盖
启动和管理线程
同步并发操作
设计并发代码
调试多线程应用

精选笔记:C++11并发编程关于原子操作atomic的代码示例

24小时24分钟前回答

一:概述

项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这种方式。

为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一个线程执行过程中可能被内核临时挂起,这就是线程切换,当内核再次切换到该线程时,之前的数据可能已被修改,不能保证原子操作。

C++11提供了个原子的类和方法atomic,保证了多线程对变量原子性操作,相比加锁机制mutex.lock(),mutex.unlock(),性能有几倍的提升。

所需头文件<atomic>

二:错误代码

//全局变量
int g_num = 0;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    g_num++;
  }
  return ;
}
int main()
{
  //创建线程1
  thread t1(fun);
  //创建线程2
  thread t2(fun);
  t1.join();
  t2.join();
  cout << g_num << endl;
  getchar();
  return 1;
}

应该输出结果20000000,实际每次结果都不一样,总是小于该值,正是由于多线程操作同一变量而没有保证原子性导致的。

三:加锁代码

//全局变量
int g_num = 0;
mutex m_mutex;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    m_mutex.lock();
    g_num++;
    m_mutex.unlock();
  }
  return ;
}
int main()
{
  //获取当前毫秒时间戳
  typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type;
  microClock_type tp1 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
  long long time1 = tp1.time_since_epoch().count();
  //创建线程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "总数:" << g_num << endl;
  //获取当前毫秒时间戳
  microClock_type tp2 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
  long long time2 = tp2.time_since_epoch().count();
  cout << "耗时:" << time2 - time1 << "ms" << endl;
  getchar();
  return 1;
}

执行结果:多次测试输出均为20000000,耗时在3.8s左右

四:atomic原子操作代码

//全局变量
atomic<int> g_num = 0;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    g_num++;
  }
  return ;
}
int main()
{
  //获取当前毫秒时间戳
  typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type;
  microClock_type tp1 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
  long long time1 = tp1.time_since_epoch().count();
  //创建线程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "总数:" << g_num << endl;
  //获取当前毫秒时间戳
  microClock_type tp2 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
  long long time2 = tp2.time_since_epoch().count();
  cout << "耗时:" << time2 - time1 << "ms" << endl;
  getchar();
  return 1;
}

执行结果:多次测试输出均为20000000,耗时在1.3s左右

五:小结

c++11的原子类atomic相比使用加锁机制性能有2~3倍提升,对于共享变量能用原子类型的就不要再用加锁机制了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接

展开阅读

相关资源

  • C/C++实践进阶之道:写给程序员看的编程书

    C/C++实践进阶之道:写给程序员看的编程书

    本书是一本C/C 语言应用能力进阶的图书,包含99个经典实例与综合案例的透彻解析,具有很高的实用性和可读性,对于初级程序员和学习编程语言的大学生大有裨益

    大小:281.7 MB编程设计

    立即下载
  • C++编程调试秘笈

    C++编程调试秘笈

    大小:19439 MB MC++编程

    立即下载
  • Visual C++面向对象编程教程(第2版)

    Visual C++面向对象编程教程(第2版)

    本书系统地介绍了Visual C++面向对象编程的基本原理和方法。主要内容包括C++程序设计、Visual C++编程基础和Visual C++高级编程三个部分,按照VisualC++编程环境C++语言应用程序向导文档/视图结构对话框和控件MFC图形处理编程深入的顺序计教学内容。本书适合作为高等学校相关课程的教材或参考书,也可作为Visual C++应用开发人员的自学读本或培训教材。 目录 前言 第1章 Visual C++集成开发环境 1.1 Visual C++概述 1.1.1 Visual C++的

    大小:5.71 MBC++编程

    立即下载
  • C++编程实例详解

    C++编程实例详解

    C++编程实例详解 作者:(美)JesseLiberty 出版社: 出版时间:2000-01

    大小:13.66MBC++

    立即下载
  • c++ 面向对象高效编程

    c++ 面向对象高效编程

    《 C++面向对象高效编程(第2版) 》的所有内容都是经验之谈。书中的练习都建立在Kayshav多年的C+++经验基础上。Kayshav不仅详尽地解释了面向对象的概念以及从理论上介绍C++的语言特性,还介

    大小:338 MBc++

    立即下载
  • C++标准模板库编程实战

    C++标准模板库编程实战

    《C++标准模板库编程实战》 介绍最新的C++14标准的API、库和扩展,以及如何将它们运用到C++14程序中。在书中,作者Ivor Horton 则阐述了什么是STL,以及如何将它们应用到程序中。我们将学习如何

    大小:130.9 MBC++编程

    立即下载

学习笔记

7小时33分钟前回答

C++11并发编程:多线程std::thread

一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。 所需头文件thread 二:构造函数 1.默认构造函数 thread() noexcept 一个空的std::thread执行对象 2.初始化构造函数 templateclass Fn, class... Args explicit thread(Fn fn, Args... args); 创建std::thread执行对象,线程调用threadFun函数,函数参数为args。 void threadFun(int a){ cout "this is thread fun !" endl;}thread t1(threadFun, 2); 3.拷贝构造函数 thread(const thread 拷贝构造函数被禁用,std::thread对象不可拷贝构造 void threa……