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. Wordpress 忘记密码怎么办?

    最近一段时间很忙,很久没更新自己博客了,结果忘记了密码? 这里提供两种方法解决. 1.  点击忘记密码,会根据你的邮箱发送一封密码重置邮件,如果没配制邮件或是空间没开启支持,那就有点悲剧了,可以用第二 ...

  2. Android应用程序开发

    第一章 Android应用初体验 1.1应用基础 activity是Android SDK中Activity类的一个具体实例,负责管理用户与信息屏的交互. 应用的功能是通过编写一个个Activity子 ...

  3. 常用工具说明--搭建基于rietveld的CodeReview平台(未测试)

    为什么要codereview . 整个团队的编码风格是统一的. . 有高手能对自己的代码指点一二,从而提高编码水平. . 减少低级错误的出现 . 约束自己写高质量的代码,因为是要给人看的. 我们对co ...

  4. wcf datetime json format

    wcf 内置的json序列化工具,有时需要替换,或者特殊情况的处理,需要修改. 我也遇到了Dto属性类型是datetime,json的反序列化 和 序列号不友好. 这是国外网站的一个方案:Replac ...

  5. Why Isn't curr_items Decreasing When Items Expire?

    Why Isn't curr_items Decreasing When Items Expire?

  6. 2.VS2012为创建的类添加注释的模板

    在项目中给类添加注释的优点: 1.方便查看这个类是为了那些功能 2.是成员小组中的谁负责编写的 根据自己的vs的安装路径找到类模板的位置:D:\Program Files (x86)\Microsof ...

  7. RabbitMQ - 任务队列

    这次我们试着实现这样一个小程序: 嗯,就是任务队列(task queue).不是将任务集中在一堆并一直等到所有任务一并完成为止,而是将每一个任务封装为一个消息,并将其发送到队列,后台的workers就 ...

  8. MyBatis 知识点梳理

    简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了.有疏漏的地方也欢迎大家评论指出.闲言少叙,进入正题....... MyBatis知识 ...

  9. 虚拟机下centos时间不正确的方便解决方法

    就是用NTP了,通过外部的服务同步时间. ntpdate us.pool.ntp.org | logger -t NTP 如果没有ntpdate ,可以使用 yum install ntpdate 进 ...

  10. 第十三章.MySQL数据库与JDBC编程(下)

    JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: publi ...