c++11 多线程新特性学习 (1) 管理线程
1.基础介绍
c++11中,线程是通过std::thread对象来开始的,用法为
#include<thread> //必须包含的头文件
void do_work(){
std::cout<<"Hello World";
}
int main(){
std::thread my_thread(do_work);
my_thread.jion(); //这里表示主线程等待此线程完成,如果不用jion或systen("pause") 程序会报R6010错误
}
这样就开启了一个新线程,并且运行的是do_work这个函数
要注意的是当给线程构造函数传递一个临时的且未命名的变量,要用新的方法如下
#include "thread" void Hello(){
std::cout << std::this_thread::get_id()<<std::endl;
} class A{
public:
void operator () () const
{
Hello();
}
};
int main(int argc, char *argv[]) { std::thread t{ A() };// or std::thread t((A()));
std::cout << std::this_thread::get_id()<<std::endl;
system("pause");
}//会输出两个线程id
以上代码会在新线程中执行Hello函数,其中这里类名后跟括号的叫匿名对象,即默认构造一个对象,但是这个对象只存在于构造该对象的那行代码,离开构造匿名对象的那行代码后立即调用析构函数,如
class A{
public:
A(){
std::cout << "A";
}
};
int main(int argc, char *argv[]) {
A();
system("pause");
}//这里会输出A
而这种匿名对象当做std::thread的参数的话就会被当做是函数而不是对象,所以要用上述特殊的方法
要传递参数给线程时,用一下方式
void f(int i,int d);
void fun()
{
std::thread t(f,,);
}
这里1就是参数i,10就是参数d.另外要注意这里传参时调用的函数会盲目的复制传进区的参数而不是原先的值,如果不想调用复制使用原值的话,使用std::thread t(f,std::ref(1),10)即可
2.线程管理
一旦开始了线程,你需要显式决定是等它完成还是让它自行运行,对于c++11 来说,两个方式分别用 jion() ,detach();如果你在std::thread对象销毁前没做决定,那么你的程序会在std::thread的析构函数调用std::terminate()终止.
如果选择分离,那么该线程可能在std::thread对象被销毁后很久还在运行,这种情况下要注意防止调用一个可能在线程结束前就被销毁的对象
调用join(),则主线程就会一直在那里等待新起的线程执行完才会继续往下执行.你只能对一个给定线程调用join()或者 detach()一次,可以用joinable()判断
互斥
#include <mutex>
std::mutex some_mutex_;
void fun(){
std::lock_guard<std::mutex> l(some_mutex_);
std::cout << "进到锁内部"<<std::endl;
}
c++11 多线程新特性学习 (1) 管理线程的更多相关文章
- atitit.Oracle 9 10 11 12新特性attilax总结
atitit.Oracle 9 10 11 12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1. 审计简介 1 1.4. ...
- java8 新特性学习笔记
Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...
- 【C++11】新特性——auto的使用
[C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...
- 【C++11】新特性——Lambda函数
本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...
- C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)
1. 概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...
- Qt5 中对 C++11 一些新特性的封装
在 Qt5 中,提供更多 C++11 的特性支持,接下来我们将进行详细的说明. slots (槽) 的 Lambda 表达式 Lambda表达式 是 C++11 中的一个新语法,允许定义匿名函数.匿名 ...
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- c++11的新特性
好奇心来源于下面的一段代码, 一个是unordered_map, 这是c++11新加的container. 另外还有unordered_set, unordered_multimap, unorder ...
随机推荐
- C 标准库 - string.h之strcat使用
strcat Appends a copy of the source string to the destination string. The terminating null character ...
- Visual Studio中修改项目的输出目录
1. 如在Solution中的项目名称为 ProjectA 但在本地目录显示却想换成: MyProject 2. 应该做的修改是: 2.1. 将本地目录的 ProjectA手动修改成 MyProjec ...
- FocusBI: 商业智能场景(原创)
关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.co ...
- python 包管理工具Pipenv
Kenneth Reitz的最新工具Pipenv可以用于简化Python项目中依赖项的管理. 它汇集了Pip,Pipfile和Virtualenv的功能,是一个强大的命令行工具. 入门 首先使用pip ...
- bzoj 2164: 采矿
Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n的整数编号.为了方便起见, ...
- 阿里云服务器docker搞定镜像
docker的安装可以看前面的文章 这里我的docker已经安装完成了,该搞镜像了:这里的镜像用的是我以前自己搞的,虽然镜像有点大,但是胜在自己搞的,熟悉(熟悉不熟悉鬼知道) 我的镜像放在了阿里云容器 ...
- jquery获取子元素
Jquery获取子元素的方法有2种,分别是children()方法和find()方法. 下面我们分别来使用这两种方法,看看它们有何差异. children()方法:获取该元素下的直接子集元素 find ...
- AngularJS 指令 实现文本水平滚动效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VMware 扩展磁盘容量
背景:创建虚拟机后,发现原先定的磁盘容量不够了,这时候可以通过vmware扩展磁盘容量 步骤一 先关闭虚拟机,右键虚拟机设置:(我没关虚拟机,所以灰显了) 步骤二: 启动VMware环境下的Linux ...
- python os.popen 乱码问题
os.popen('ipconfig') 命令返回的结果在调试时乱码了: output1 = os.popen('ipconfig') o1=output1.read() 我猜这里输出的内容要和控制台 ...