概述

在c++11之前,c++并未对线程编程提供直接的支持。在c++11之后,支持了线程管理、同步、条件变量等支持。

在其他的c++库中(例如UE的线程库)还增加了多任务模型的抽象。

用法举例

参考测试项目的modrenc_thread.cpp文件

主要内容:

  • 线程的创建
  • 使用future&async进行异步操作
  • 使用future&promise进行异步操作
  • 有锁同步
  • 无锁同步(原子操作)
#include "ModernCppTestHeader.h"
#include <thread>
#include <future>
#include <mutex> namespace n_thread {
void increment(int n)
{
int i = 0;
while (++i < n)
{
LOG_VAR(i);
}
} int accumulate(int n)
{
int r = 0;
for (size_t i = 0; i <= n; i++)
{
r += i;
} LOG_VAR(r);
return r;
} void accumulate_p(int n, std::promise<int> p)
{
int r = accumulate(n);
p.set_value(r);
} std::mutex mtx;
void print_block_sync(int n, char c)
{
std::lock_guard<std::mutex> guard(mtx); for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << '\n';
} void print_block_async(int n, char c)
{
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << '\n';
} class Number
{
public:
Number(int v) :v(v) {}
int v;
}; void counter_async(Number* num, int n)
{
for (int i = 0; i < n; ++i) {
num->v++;
}
} void counter_sync(std::atomic<int>* v, int n)
{
for (int i = 0; i < n; ++i) {
++(*v);
}
}
} void thread_test()
{
LOG_FUNC(); LOG_TAG("线程创建");
{
std::thread t(n_thread::increment, 3);
t.join();
LOG("main thread goes on");
} LOG_TAG("异步操作 使用 future&async");
{
std::future<int> f = std::async(n_thread::accumulate, 3); LOG("等待异步计算");
int sum = f.get();
LOG_VAR(sum);
} LOG_TAG("异步操作 使用 future&promise");
{
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(n_thread::accumulate_p, 3, std::move(p));
LOG("等待异步计算");
int sum = f.get();
LOG_VAR(sum);
t.join();
} LOG_TAG("有锁同步");
{
{
LOG("不同步");
std::thread t1(n_thread::print_block_async, 50, '#');
std::thread t2(n_thread::print_block_async, 50, '$');
t1.join();
t2.join();
} {
LOG("同步");
std::thread t1(n_thread::print_block_sync, 50, '#');
std::thread t2(n_thread::print_block_sync, 50, '$');
t1.join();
t2.join();
}
} LOG_TAG("无锁同步");
{
{
LOG("不同步, 有可能能正确计算,但是不稳定");
n_thread::Number n(0);
std::thread t1(n_thread::counter_async, &n, 100000);
std::thread t2(n_thread::counter_async, &n, 100000);
t1.join();
t2.join();
LOG_VAR(n.v);
} {
LOG("同步");
std::atomic<int> v(0);
std::thread t1(n_thread::counter_sync, &v, 100000);
std::thread t2(n_thread::counter_sync, &v, 100000);
t1.join();
t2.join();
LOG_VAR(v);
}
} }

现代C++(Modern C++)基本用法实践:八、线程支持的更多相关文章

  1. Linux中sed的用法实践

    Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...

  2. 20145203盖泽双 《网络对抗技术》实践八:Web基础

    20145203盖泽双 <网络对抗技术>实践八:Web基础 1.实践目标 (1)编写Web前端--含有表单的HTML代码. (2)编写Web前端--javascipt验证用户名.密码的代码 ...

  3. nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点

    nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 ...

  4. Retrofit 2.0 超能实践,完美支持Https传输

    http://blog.csdn.NET/sk719887916/article/details/51597816 前阵子看到圈子里Retrofit 2.0,RxJava(Android), OkHt ...

  5. 北京太速科技-第六代Intel i7四核八线程6U VPX主控板

    一.产品概述 该产品是一款基于第六代Intel i7四核八线程的高性能6U VPX刀片式计算机.产品提供了可支持全网状交换的高速数据通道,其中P1,P2各支持4个PCIe x4 Gen3总线接口,P3 ...

  6. Linux find命令的用法实践

    一.find命令简介 Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大 ...

  7. PHP命令空间namespace及use的用法实践总结

    以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...

  8. docker 实践八:docker-compose

    本篇介绍 docker 官方三剑客之一的 docker-compose. 注:环境为 CentOS7,docker 19.03. docker-compose docker-compose 的前身是开 ...

  9. UWP开发之Mvvmlight实践八:为什么事件注销处理要写在OnNavigatingFrom中

    前一段开发UWP应用的时候因为系统返回按钮事件(SystemNavigationManager.GetForCurrentView().BackRequested)浪费了不少时间.现象就是在手机版的详 ...

  10. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(八)

    前言 本篇幅将对系统的菜单管理模块进行说明,系统的菜单采用树形结构,这样可以更好地方便层级设计和查看.本示例将说明如何通过EntityFramework读取递归的菜单树形结构,以及结合EasyUI的t ...

随机推荐

  1. 大模型应用开发初探 : 手搓一个简易Agent

    大家好,我是Edison. 今天是中秋节前最后一个工作日,加油挺住,马上就放假了! 近期我一直在学习和了解LLM的相关知识,听到大家都在谈论AI Agent,说它是接下来几年大模型应用开发的新范式,那 ...

  2. MongoDB入门实战教程(8)

    前面我们学习了模型设计中的内嵌模式与引用模式的使用,本篇我们来看看在模型设计中如何套用常见的设计模式来降低设计难度,提高查询效率. 1 MongoDB也有设计模式? 在使用C#/Java等开发语言的时 ...

  3. java基础--eclipse使用、object类、String类、stringbuffer类

    eclipse使用的步骤 第一步: 选择工作目录. 以后在Eclipse上面写的所有代码都是在工作目录上的. 第二步: 在Project Exploer 窗口上创建一个工程,以后我们写代码都是以工程作 ...

  4. base64编码文件下载

    比方说,我有一个bse64如下的编码文件: const base64Str = "UEsDBBQABgAIAAAAIQAykW9XZgEAAKUFAAATAAgCW0NvbnRlbnRfVH ...

  5. Codeforces Round #609 (Div. 2) ABC 题解

    A. Equation 题意:找出两个合数a,b使得 a - b = n. 思路:水题,让a = 10n, b = 9n ,那么ab必定都是合数. #include<iostream> # ...

  6. 项目捷报 | 冠捷科技泰国工厂THA MES项目成功验收!TPV国际化布局再添里程碑!

    近日,盘古信息与冠捷科技(TPV)携手打造的泰国工厂MES项目(THA MES项目)圆满通过验收.这不仅标志着TPV在全球数字化制造布局中取得重大突破,更成为盘古信息赋能其"两国五城七期&q ...

  7. java static 代码块, 构造函数, 普通代码块执行顺序

    简介 没有答出来, 根据如下代码的运行结果可知, 显示父类的静态代码块, 然后是子类的静态代码块, 然后是父类的普通代码块和构造函数, 接着是子类的普通代码块和构造函数. code /** * Cre ...

  8. 如何快速运用iPaas与协议进行接口对接

    在数字化浪潮的推动下,企业对于数据整合和流程协同的需求日益迫切.然而,传统的数据集成方式往往面临着开发周期长.维护成本高.扩展性差等问题.这时,iPaas(Integration Platform a ...

  9. 使用 Scoop 安装 Mambaforge 踩坑指南

    为什么用 Scoop 安装 Mambaforge? Mambaforge 作为 Anaconda 的轻量级替代品,以其极速包管理能力脱颖而出.而 Scoop 则是 Windows 平台上优雅的包管理解 ...

  10. SciTech-EECS-Circuits-Power-PWM 控制器: PWM 的 "三种(脉频/脉宽/组合)调制方式 和 三种采样及闭环控制方式" + 应用之 UC3842 / KA3842 电路设计 与 快速检修

    SciTech-EECS-Circuits-Power-PWM 控制器: PWM 的 三种调制方式 和 三种采样及闭环控制 PWM 的 三种调制方式 "脉频(脉冲频率)调制"和&q ...