c++11の简单线程管理
1、简单的例子
#include "stdafx.h"
#include <iostream>
#include <thread> void function_1()
{
for (size_t i = ; i < ; i++)
{
std::cout << "from function 1" << std::endl;
}
} int main()
{
std::thread t(function_1); for (size_t i = ; i < ; i++)
{
std::cout << "from function main"<<std::endl;
} t.join(); std::getchar(); return ;
}
在一个线程中,开了另一个线程去干另一件事,使用join函数后,原始线程会等待新线程执行结束之后,再去销毁线程对象。
这样有什么好处?---->因为它要等到新线程执行完,再销毁,线程对象,这样如果新线程使用了共享变量,等到新线程执行完再销毁这个线程对象,不会产生异常。如果不使用join,使用detch,那么新线程就会与原线程分离,如果原线程先执行完毕,销毁线程对象及局部变量,并且新线程有共享变量或引用之类,这样新线程可能使用的变量,就变成未定义,产生异常或不可预测的错误。
所以,当你确定程序没有使用共享变量或引用之类的话,可以使用detch函数,分离线程。
但是使用join可能会造成性能损失,因为原始线程要等待新线程的完成,所以有些情况(前提是你知道这种情况,如上)使用detch会更好。
上述代码如果主函数中的for循环发生异常,t.join就不会执行,因此需要注意线程安全
2、线程安全
std::thread t(function_1);
try
{
for (size_t i = ; i < ; i++)
{
std::cout << "from function main" << std::endl;
} }
catch (const std::exception&)
{
t.join();
}
t.join();
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 = ; i < ; i++)
{
std::cout << "from function main" << std::endl;
}
}
catch (const std::exception&)
{
t.join();
throw;
}
t.join();
std::getchar();
return ;
}
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;
c++11の简单线程管理的更多相关文章
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- (转)C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- c++11简单的线程
线程的管理 启动线程 为了让编译器识别 std::thread 类,这个简单的例子也要包含 <thread> 头文件. 如同大多数C++标准库一样 线程在std::thread对象创建(为 ...
- 基于C++11的100行实现简单线程池
基于C++11的100行实现简单线程池 1 线程池原理 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小, ...
- android 进程/线程管理(二)----关于线程的迷思
一:进程和线程的由来 进程是计算机科技发展的过程的产物. 最早计算机发明出来,是为了解决数学计算而发明的.每解决一个问题,就要打纸带,也就是打点. 后来人们发现可以批量的设置命令,由计算机读取这些命令 ...
- iOS 线程管理的学习记录
本文转载至 http://www.2cto.com/kf/201312/265451.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- Unix进程和线程管理及其异同
Unix进程和线程管理及其异同 一,进程 1,什么是进程 在最初的单处理器系统中,系统中的多道程序按照一定规则切换而实现多任务处理,后来发现多个程序并发导致系统资源被共享,为了描述和管理程序对共享资源 ...
- 基于Linux/C++简单线程池的实现
我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等.C++11中的STL也 ...
- 基于C++11的线程池实现
1.线程池 1.1 线程池是什么? 一种线程管理方式. 1.2 为什么用线程池? 线程的创建和销毁都需要消耗系统开销,当线程数量过多,系统开销过大,就会影响缓存局部性和整体性能.而线程池能够在充分利用 ...
随机推荐
- Android--MediaRecorder录音录像
前言 Android除了支持播放多媒体文件之外,还可以从对应的硬件中捕获多媒体,比如从麦克风录音.从摄像头录像等.本篇博客讲解一下Android下如何通过MediaRecorder进行录音以及录像的步 ...
- .NET快速信息化系统开发框架 V3.2 -> Web 用户管理模块编辑界面-组织机构选择支持级联选择
下拉框级联选择功能非常的实用,框架用户管理编辑界面对组织机构的选择在3.2版本中新增了级联选择的支持,让组织机构的选择更加的方便与高效,也不容易出错. 我们框架的组织机构结合实际分成了5种类型,分别为 ...
- Zookeeper注册中心和Dubbo-Admin管理平台的搭建
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 如何打通CMDB,实现就近访问
CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...
- tcpdump工具使用说明
tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 注意,tcpdump只能抓取流经本机的数据包,不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将 ...
- 程序员如何描述清楚线上bug
案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...
- .Net语言 APP开发平台——Smobiler学习日志:如何调用API进行短信发送
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.发送短信代码 VB: Pr ...
- jquery/js知识点收藏
1]关于页面跳转 "window.location.href"."location.href"是本页面跳转 "parent.location.href ...
- Sqlite操作帮助类
sqlite帮助类 using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...
- 关于mybatis条件查询 报错:元素内容必须由格式正确的字符数据或标记组成
原查询 select sum(case when age<=16 then 1 else 0 end ) age1, sum(case when age>16 and age<=25 ...