C++11多线程(一):语言层面的并发
来源:互联网 发布:carven淘宝旗舰店 编辑:程序博客网 时间:2024/06/14 17:33
参考连接:http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438288.html
目录
1.与 C++11 多线程相关的头文件
2.简单的示例
3.sleep_for,让线程睡一会
4.mutex,互斥加锁
C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件<thread>、<mutex>、<atomic>、<future>等用于支持多线程,并且有很好的平台移植性。
1.与 C++11 多线程相关的头文件
C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。
<atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型
和与 C 兼容的原子操作的函数。
<thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
<mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard,
std::unique_lock, 以及其他的类型和函数。
<condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和
std::condition_variable_any。
<future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和
std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。
2.简单的示例
使用join来阻塞主线程,直到子线程结束;
并使用lambda表达式写子线程调用的函数;
使用mutex来加锁,让子线程依次调用lock与unlock之间的代码;
并将mutex变量,引用的方式传入lambda函数。
<span style="font-size:18px;">#include "stdafx.h"#include <iostream>using namespace std; #include <thread>#include <vector>#include <mutex>void hello(){cout << "hellor from thread!" << endl;}int _tmain(int argc, _TCHAR* argv[]){vector<thread> threads;mutex mutexVar;for (size_t i = 0; i < 5; i++){threads.push_back(thread([&mutexVar]()//lambda函数 ,并传入mutexVar变量{mutexVar.lock();//加锁cout << "lambda thread id:" << this_thread::get_id() << endl;mutexVar.unlock();}));}for (auto& threadVar:threads){threadVar.join();//阻塞主线程,等待子线程结束}cout << "Main thread id:" <<this_thread::get_id()<< endl;return 0;}</span>输出:
<span style="font-size:18px;">lambda thread id:9044lambda thread id:1388lambda thread id:7984lambda thread id:7144lambda thread id:7176Main thread id:6264请按任意键继续. . .</span>
3.sleep_for,让线程睡一会
<span style="font-size:18px;">#include "stdafx.h"#include <iostream>using namespace std; #include <thread>#include <vector>#include <mutex>int _tmain(int argc, _TCHAR* argv[]){mutex mutexVar;thread thread1([&mutexVar](){this_thread::sleep_for(chrono::seconds(12));for (size_t i = 0; i < 10; i++){mutexVar.lock();//加锁cout << "thread1 id:" << this_thread::get_id() << ",num:" << i << endl;mutexVar.unlock();}});thread thread2([&mutexVar](){this_thread::sleep_for(chrono::seconds(1));for (size_t i = 0; i < 10; i++){mutexVar.lock();//加锁cout << "thread2 id:" << this_thread::get_id()<<",num:"<<i << endl;mutexVar.unlock();}});thread1.join();thread2.join();cout << "Main thread id:" <<this_thread::get_id()<< endl;return 0;}</span>输出:
<span style="font-size:18px;">thread2 id:8428,num:0thread2 id:8428,num:1thread2 id:8428,num:2thread2 id:8428,num:3thread2 id:8428,num:4thread2 id:8428,num:5thread2 id:8428,num:6thread2 id:8428,num:7thread2 id:8428,num:8thread2 id:8428,num:9thread1 id:4856,num:0thread1 id:4856,num:1thread1 id:4856,num:2thread1 id:4856,num:3thread1 id:4856,num:4thread1 id:4856,num:5thread1 id:4856,num:6thread1 id:4856,num:7thread1 id:4856,num:8thread1 id:4856,num:9Main thread id:8744请按任意键继续. . .</span>由于thread1的sleep时间较长,thread2先输出
4.mutex,互斥加锁
<span style="font-size:18px;">int _tmain(int argc, _TCHAR* argv[]){mutex mutexVar;vector<thread> threads;int nTextNum = 0;for (size_t i = 0; i < 5; i++){threads.push_back(thread([&mutexVar, &nTextNum](){ //lambdafor (size_t i = 0; i < 10000; i++){mutexVar.lock();//加锁auto fun = [&nTextNum]() //lambda{nTextNum++;};fun();//调用lambda函数mutexVar.unlock();}}));}for (auto& threadVar:threads){threadVar.join();}cout << "Main thread id:" << this_thread::get_id() << endl;cout << "nTextNum:" << nTextNum << endl;return 0;}</span>输出:
<span style="font-size:18px;">Main thread id:1760nTextNum:50000请按任意键继续. . .</span>如果屏蔽lock(),输出值nTextNum<50000,共享数据操作应该使用mutex。
- C++11多线程(一):语言层面的并发
- C语言学习心得一:__stdcall、__cdcel和__fastcall三者的区别(三者是对编译器层面的影响,对程序业务逻辑不影响)
- Go游戏服务器开发的一些思考(一):语言层面
- 一:Java 并发和多线程的介绍
- 【C/C++开发】C++11 并发指南一(C++11 多线程初探)
- 多线程&并发(一)
- 多线程并发学习(一)
- C语言简单的多线程
- C语言多线程的引入
- C语言的多线程编程
- 多线程编程:多线程并发制单的开发记录【一】
- 高并发大数据数据库层面的处理
- Java语言层面和JVM层面方法特征签名的区别 及 实例分析
- 线程概述——基于POSIX的C语言多线程基础知识(一)
- linux下C语言多线程(一)线程的创建与取消
- linux下C语言多线程(一)线程的创建与取消
- linux下C语言多线程(一)线程的创建与取消
- 【JAVA并发学习一】并发和多线程
- 项目的步骤,菜鸟的学习方法
- 指针变量的作用
- java反射
- 【codeforces 384E】Propagating tree 中文题意&题解&代码(c++)
- 深入理解计算机系统 第二章 表示和操作信息
- C++11多线程(一):语言层面的并发
- GCC跟G++区别
- 后台页面3大布局用到的iframe
- C# 中DateTime的各种使用
- leetcode -- Different Ways to Add Parentheses -- 重点
- Emmagee(三)-获取内存信息
- python3.4下PyQt5信号槽使用
- 创建,查看,删除,修改数据库
- 远程通过命令行开启局域网计算机的远程桌面服务