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) 管理线程的更多相关文章

  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. ...

  2. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  3. 【C++11】新特性——auto的使用

    [C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...

  4. 【C++11】新特性——Lambda函数

    本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...

  5. C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)

    1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...

  6. Qt5 中对 C++11 一些新特性的封装

    在 Qt5 中,提供更多 C++11 的特性支持,接下来我们将进行详细的说明. slots (槽) 的 Lambda 表达式 Lambda表达式 是 C++11 中的一个新语法,允许定义匿名函数.匿名 ...

  7. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  8. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  9. c++11的新特性

    好奇心来源于下面的一段代码, 一个是unordered_map, 这是c++11新加的container. 另外还有unordered_set, unordered_multimap, unorder ...

随机推荐

  1. Linux上用户之间对话

    Linux上用户之间对话 昨天想在CentOS7上与另外一个用户对话,但把命令忘记了,特此记录下来. Write命令 write命令是单向发送一条消息给同机器的Linux用户.首先通过who命令查看谁 ...

  2. PHP正则表达式(转载)

    这个星期要攻破PHP正则表达式   正则表达式定义 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取 ...

  3. linux多线程同步

    1. 互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行访问.互斥量的工作流程:创建一个互斥量,把这个互斥量的加锁调用放在临界区的开始位置,解锁调用放到临界区的 ...

  4. 虚拟机下linux 的root密码忘记怎么修改(转)

    1.开机时任意按一个方向键,进入界面,选择linux系统,按e键进入 2.然后用上下键选择kerner(内核)那一行,按e键进入编辑界面,编辑界面最后一行显示如下:(grub edit> ker ...

  5. springboot入门记

    在idea中直接新建: 选择web: 在idea中启动“项目名称”Application中的main即可: 或者在项目目录下运行:mvn spring-boot:run: 或者: mvn instal ...

  6. Java开发规范(MySQL开发规范)-《阿里巴巴Java开发手册》

    官方介绍:https://yq.aliyun.com/articles/69327 官方GitHub(包括IDE规范检查插件):https://github.com/alibaba/p3c 1.0.2 ...

  7. 【关于eclipse的一些自己常用的插件】

    代码自动走查: sonarlnt:

  8. maven配置编译器的版本

    发现每次启动idea时,项目里很多红色错误,都是的编译器版本不对,每次都要手动修改. 其实在pom里把默认编译器版本加进去就好了. <build> <plugins> < ...

  9. Halcon学习笔记——条形码的定位与识别

    一维码的原理与结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息. 一维条码数据结构,分四个区域.组成分别为静区.起始/终止符.校验符.数据符. 一维条码 ...

  10. spring整合struts2和hibernate

    1.spring 1.1 jar包 1.2 spring.xml <?xml version="1.0" encoding="UTF-8"?> &l ...