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 ...
随机推荐
- Visual Studio中修改项目的输出目录
1. 如在Solution中的项目名称为 ProjectA 但在本地目录显示却想换成: MyProject 2. 应该做的修改是: 2.1. 将本地目录的 ProjectA手动修改成 MyProjec ...
- Hibernate 多对一映射
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBL ...
- WEBPACK & BABEL 打包项目
本文首发于 BriFuture's Blog. 最近在用 Vue 重写之前的一个项目 Compass,这个项目以前是用 QML + JavaScript 在 Qt 平台上搭建的.这是我本科毕设时做的一 ...
- MySql下载
一般企业办的mysql下载不到 1.准备 注册一个orcle账号 2.跳转到http://www.mysql.com/ ,然后点击Downloads导航栏 滚动到最下面并点击[Community(GP ...
- Firebird 条件函数
1.iif IIF (<condition>, ResultT, ResultF) 示例: select iif( sex = 'M', 'Sir', 'Madam' ) from Cu ...
- 在centos linux上安装docker
前置条件 64-bit 系统 kernel 3.10+ 1.检查内核版本,返回的值大于3.10即可. $ uname -r 2.确保yum是最新的 $ yum update 3.安装 Docker y ...
- Centos 从零开始 (四)
12:nginx架设 rtmp直播 首先在之前 所安装的nginx是用 yum 源安装的.却不能为nginx添加他的模块 所以要用wget来下载源文件 来进行源码配置与安装.开搞 [root@loca ...
- MySQL的四种事务隔离级别【转】
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- Boxlayout中button改变大小
需要先设置maximunsize neuStart.setBorder(BorderFactory.createRaisedBevelBorder()); neuStart.setMaximumSiz ...
- mysql case when的使用
SELECT (CASE payType WHEN 1 THEN '微信' WHEN 2 THEN '支付宝' ELSE '余额' END) as type, count(payType) FROM ...