1、简单的例子

#include "stdafx.h"
#include <iostream>
#include <thread>void function_1()
{for (size_t i = 0; i < 100; i++){std::cout << "from function 1" << std::endl;}
}int main()
{std::thread t(function_1);for (size_t i = 0; i < 100; i++){std::cout << "from function main"<<std::endl;}t.join();std::getchar();return 0;
}

在一个线程中,开了另一个线程去干另一件事,使用join函数后,原始线程会等待新线程执行结束之后,再去销毁线程对象。
这样有什么好处?---->因为它要等到新线程执行完,再销毁,线程对象,这样如果新线程使用了共享变量,等到新线程执行完再销毁这个线程对象,不会产生异常。如果不使用join,使用detch,那么新线程就会与原线程分离,如果原线程先执行完毕,销毁线程对象及局部变量,并且新线程有共享变量或引用之类,这样新线程可能使用的变量,就变成未定义,产生异常或不可预测的错误。
所以,当你确定程序没有使用共享变量或引用之类的话,可以使用detch函数,分离线程。
但是使用join可能会造成性能损失,因为原始线程要等待新线程的完成,所以有些情况(前提是你知道这种情况,如上)使用detch会更好。

上述代码如果主函数中的for循环发生异常,t.join就不会执行,因此需要注意线程安全

2、线程安全

    std::thread t(function_1);try{for (size_t i = 0; i < 100; i++){std::cout << "from function main" << std::endl;}}catch (const std::exception&){t.join();}t.join();

View Code

3、线程可执行的类型

在上述例子中,我们t()的参数是一个function,c++中规定,其可以是一个可调用对象即可(可被调用的对象构造),可以是函数,构造函数,lmbd表达式等,当然也可以加参数

 class Func {public:void operator()(std::string s)   //重载了运算符 ()
    {std::cout << s << std::endl;}};int main()
{std::string s= "i love u";std::thread t((Func()),s);try{for (size_t i = 0; i < 100; i++){std::cout << "from function main" << std::endl;}}catch (const std::exception&){t.join();throw;}t.join();std::getchar();return 0;
}

View Code

4、线程通讯

如果需要减少复制操作,我们可以使用引用类型

void operator()(std::string & s) //重载了运算符 ()
{
std::cout << s << std::endl;
}

但是对于线程间的通讯,是无效的

我们可以在调用的时候

std::thread t((Func()),std::ref( s));

此中方法我们可以实现引用的线程间传递,但是也造成了不安全,我们可以使用std::move();

c++11中有很多对象只能够被移动,不能都被传递复制,例如(thread)

5、获取cpu支持同时工作的线程数std::cout<< std::thread::hardware_concurrency()<<std::endl;

转载于:https://www.cnblogs.com/xietianjiao/p/10449139.html

c++11の简单线程管理相关推荐

  1. [转]C++ 11 多线程--线程管理

    转载地址:https://www.cnblogs.com/wangguchangqing/p/6134635.html 说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并 ...

  2. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  3. C++11多线程----线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  4. C++11 多线程 线程管理基础

    线程管理基础 C++11 所有的线程都封装在<thread>头文件中,使用命名空间std说明. 最简单的例子: #include <iostream> #include < ...

  5. java中的STL库_C++11 STL线程库实现一个简单的线程池

    使用C++11 STL线程库实现一个线程池.处理机制是抢占式的,即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值),使用std::mutex和std::condit ...

  6. C++11线程管理基础

    1. 启动线程 在C++ 11中线程是在std::thread对象创建时启动.因为我们把启动线程的重心放在如何构造这个thread对象,其构造函数有以下几个: //仅仅是构造一个线程类,但没有和具体化 ...

  7. C++多线程并发中线程管理

    一.何为并发 刚开始接触计算机编程语言时,我们编写一个程序,在main入口函数中调用其它的函数,计算机按我们设定的调用逻辑来执行指令获得结果.如果我们想在程序中完成多个任务,可以将每个任务实现为一个函 ...

  8. 《C++ Concurrencyin Action》第2章--线程管理

    前言 本章主要内容: 1 启动新线程 2 等待线程与分离线程 3 线程唯一标识符 好的!看来你已经决定使用多线程了.先做点什么呢?启动线程.结束线程,还是如何监管线程?在C++标准库中只需要管理std ...

  9. c++并发编程(concurrency)----线程管理

    c++并发编程(concurrency)----线程管理 启动线程,指定线程运行函数的多种方法 等待线程执行完毕 唯一辨别线程的方法 如果已经有兴趣启动多线程程序了,那么问自己个问题,如何启动多线程? ...

最新文章

  1. 百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
  2. 使用 Jenkins 部署码云上的 Spring Boot 项目
  3. python3.7和3.8的区别-Python 3.8 有什么新变化
  4. python语言程序设计实践教程上海交通大学_《C语言实验与等级考试指导》隋雪莉 闵 芳 沈国荣著【摘要 书评 在线阅读】-苏宁易购图书...
  5. How is application controller loaded by UI5 framework
  6. Netty Associated -- ByteBuf
  7. java indexof 通配符,字符串与含有通配符‘*’的字符串匹配(非正则表达式)
  8. android常用网址
  9. python语言的开发者_写给.NET开发者的Python教程(一):引言
  10. 面对 996,程序员如何利用“碎片时间”涨薪?
  11. 一种大豆多种病害自动识别的新方法
  12. grpc python 多进程_Python多进程通信Queue、Pipe、Value、Array实例
  13. win10下安装numpy
  14. OA协同办公软件评测 —— Tower篇
  15. 假显卡测试软件,如何使用软件检测真假显卡软件验证方法简介
  16. Latex数学用法总结
  17. dede 表单必填_织梦给自定义表单增加必填功能,织梦表单必填设置
  18. fetion-robot是基于web飞信接口的飞信机器人
  19. 轻快步伐远不足以跟上轻快心情
  20. 晶体三极管的主要参数

热门文章

  1. Android CursorAdapter
  2. jQuery+Ajax+PHP 制作简单的异步数据传输(测试用户名是否可用)
  3. 如何在ArcMap中监听键盘鼠标事件
  4. #define 的换行问题
  5. [转载] New Concept English 1——Lesson 14 What colour's your…?
  6. 在安装完成oracle的时候,需要su - oracle,但有时候出现ulimit pize...
  7. python selenium --调用js
  8. hitTest:withEvent:方法流程
  9. 10款人气暴涨的PHP开源工具
  10. Z-Stack - Modification of Zigbee Device Object for better network access management