IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++11 多线程 -> 正文阅读

[C++知识库]c++11 多线程

1. std::thread

std::thread为C++11的线程类,使用方法和boost接口一样,非常方便,同时,C++11的std::thread解决了boost::thread中构成参数限制的问题,我想这都是得益于C++11的可变参数的设计风格。

我们通过如下代码熟悉下std::thread使用风格:

 1//c11.cpp
 2#include?<iostream>
 3#include?<thread>
 4void?threadfun1()
 5{
 6????std::cout?<<?"threadfun1?-?1\r\n"?<<?std::endl;
 7????std::this_thread::sleep_for(std::chrono::seconds(1));
 8????std::cout?<<?"threadfun1?-?2"?<<?std::endl;
 9}
10void?threadfun2(int?iParam,?std::string?sParam)
11{
12????std::cout?<<?"threadfun2?-?1"?<<?std::endl;
13????std::this_thread::sleep_for(std::chrono::seconds(5));
14????std::cout?<<?"threadfun2?-?2"?<<?std::endl;
15}
16int?main()
17{
18????std::thread?t1(threadfun1);
19????std::thread?t2(threadfun2,?10,?"abc");
20????t1.join();
21????std::cout?<<?"join"?<<?std::endl;
22????t2.detach();
23????std::cout?<<?"detach"?<<?std::endl;
24}

注意编译时要使用:g++ c11.cpp -lpthread
运行结果:

1threadfun1?-?1
2threadfun2?-?1
3threadfun1?-?2
4join
5detach

2. std::atomic

std::atomic为C++11封装的原子数据类型。
什么是原子数据类型?从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上来看,我们可以理解为这些原子类型内部自己加了锁。

我们下面通过一个测试例子说明原子类型std::atomic的特点。

我们使用10个线程,把std::atomic类型的变量iCount从10减到1。

 1//c11.cpp
 2#include?<thread>
 3#include?<atomic>
 4#include?<stdio.h>
 5#include?<iostream>
 6#include?<list>
 7std::atomic<bool>?bIsReady(false);
 8std::atomic<int>?iCount(10);
 9void?threadfun1()
10{
11????if?(!bIsReady)?{
12????????std::this_thread::yield();
13????}
14????while?(iCount?>?0)
15????{
16????????printf("iCount:%d\r\n",?iCount--);
17????}
18}
19int?main()
20{
21????std::list<std::thread>?lstThread;
22????for?(int?i?=?0;?i?<?10;?++i)
23????{
24????????lstThread.push_back(std::thread(threadfun1));
25????}
26????for?(auto&?th?:?lstThread)
27????{
28????????th.join();
29????}
30}

运行结果:

 1iCount:10
 2iCount:9
 3iCount:8
 4iCount:7
 5iCount:6
 6iCount:5
 7iCount:4
 8iCount:3
 9iCount:2
10iCount:1

从上面的结果可以看到,iCount的最小结果是1,没有出现小于等于0的情况,大家可以把iCount改成100甚至1000看看,可能会更直观一点。

3. std::condition_variable

C++11中的std::condition_variable就像Linux下使用pthread_cond_wait和pthread_cond_signal一样,可以让线程休眠,直到被唤醒,然后再重新执行。线程等待在多线程编程中使用非常频繁,经常需要等待一些异步执行的条件的返回结果。

转载公众号: cpp加油站

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:07:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 21:21:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码