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 ...
随机推荐
- OpenGL初识
OpenGL 概念 OpenGL提供的是一系列接口, 它是指一个规范, OpenGL规范严格规定了每个函数该如何执行, 以及它们的输出值, 具体的实现是由各个显示设备厂商, 它作为本地系统库直接运行在 ...
- HDU 5691 ——Sitting in Line——————【状压动规】
Sitting in Line Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- Navicat 大小写
1.找到数据库表的存在位置 比如我的是C:\ProgramData\MySQL\MySQL Server 5.7\Data\tinysdpm 2.修改小写的表名称 比如customer_type.fr ...
- Change - Why we need coding standards
Change - Why we need coding standards I have the idea of coding standards when I have to review my t ...
- group by 语句
user E_book go 这样的程序会出错,因为play没有使用sum,所以要分组. group by play 有函数的和没有函数的表一起使用要用 GROUP BY .AVG 求平均值,只能与数 ...
- Ajax发送GET、POST请求和响应XML数据案例
1.新建工程 新建一个java web工程,新建一个Servlet文件 AServlet.java,用于返回get和post请求. public class AServlet extends Http ...
- [javaEE] 数据库连接池和动态代理
实现javax.sql.DataSource接口 实现Connection getConnection()方法 定义一个静态的成员属性LinkedList类型作为连接池,在静态代码块中初始化5条数据库 ...
- websocket 和 dwr 做web端即时通信
一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的k ...
- elastic job 动态设置定时任务
1. 版本 <!-- import elastic-job lite core --> <dependency> <groupId>com.dangdang< ...
- svg拖拽和缩放
需求:做机房平面图,用svg实现拖拽和缩放,刚开始一头雾水,不知所措,好在皇天不负有心人........ 本文重点介绍拖拽,单纯实现很简单,但是由于vue项目,机房图有很多事件,拖拽就成了难点 简单介 ...