
基于C++11的多线程编程
C++11标准库提供的多线程工具学习和使用说明
Jimmy1224
这个作者很懒,什么都没留下…
展开
-
多线程的互斥锁应用RAII机制
什么是RAII机制RAII是Resource Acquisition Is Initialization(翻译成 “资源获取即初始化”)的简称,是C++语言的一种管理资源、避免资源泄漏的惯用法,该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象,在对象的构造函数中获取资源,在对象生命期内控制对资源的访问,最后在对象消失时,其析构函数来释放获取的资源;这里的资源可以是文件句柄,内存,Event,互斥量等等,由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭原创 2020-07-22 20:01:40 · 1369 阅读 · 0 评论 -
多线程google面试题
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推…现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2…B:2 3 4 1 2 3…C:3 4 1 2 3 4…D:4 1 2 3 4 1…问题分析:由于每个线程都固定输出一个字符,这个是不会发生变化的,要想达到预期效果,只能是每次循环向不同的文件写字符。这里考察的是线...原创 2019-05-26 14:31:48 · 528 阅读 · 0 评论 -
C++11之std::promise使用介绍
在C++11中有个future头文件,在这个头文件有一个promise类模板,std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。其模板声明如下:template< class R > class promise;1) //空模板template< class R > ...原创 2018-03-13 10:55:05 · 4753 阅读 · 0 评论 -
C++11之packaged_task使用介绍
介绍packaged_task类模板也是定义于future头文件中,它包装任何可调用 (Callable) 目标,包括函数、 lambda 表达式、 bind 表达式或其他函数对象,使得能异步调用它,其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中。简言之,将一个普通的可调用函数对象转换为异步执行的任务。模板声明如下:template< class ...原创 2019-05-02 23:46:49 · 9357 阅读 · 3 评论 -
C++11之std::future对象使用说明
std::future介绍在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量;从安全角度看,有些不妥;为此C++11提供了std::future类模板,future对象提供访问异步操作结果的机制。std::future类模板定义头文件<future>,其函数声明如下:template&l...原创 2019-05-02 23:07:53 · 69837 阅读 · 5 评论 -
C++11条件变量使用详解
condition_variable介绍在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。其主要成员函数如下:条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程因等待"条件变量的条件成立"而挂起;另外一个线程使"条件成立",给出信...原创 2019-05-02 00:31:21 · 43723 阅读 · 27 评论 -
C++11之std::async使用介绍
在C++11中有个async异步函数,其声明如下:template <class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async (launch policy, Fn&& fn, Args&&... args);该模板函数...原创 2018-03-10 12:55:00 · 10754 阅读 · 2 评论 -
c++11 call_once 使用方法
call_once是c++11中引入的新特性,用于保证某个函数只调用一次,即使是多线程环境下,它也可以可靠地完成一次函数调用。特别适用于某个初始化只执行一次的场景。若调用call_once一切顺利,将会翻转once_flag变量的内部状态,再次调用该函数时,所对应的目标函数不会被执行。若调用call_once中发生异常,不会翻转once_flag变量的内部状态,再次调用该函数时,目标函数仍...原创 2018-02-11 18:53:05 · 6306 阅读 · 0 评论 -
C++11保护共享数据的其他方法
保护共享数据的初始化过程在多线程编程中,互斥量是最通用的保护共享数据的机制。但是在某些情况下,一些资源仅需要在第一次初始化的时候需要保护,其时候就可以不需要互斥变量的保护了。比如编码中最常见的单例模式,核心代码如下://(3)获得本类实例的唯一全局访问点static CSinglton* GetInstance(){ //若实例不存在,则创建实例对象 if (NULL ==...原创 2019-04-27 17:44:00 · 730 阅读 · 0 评论 -
C++11使用互斥量保护共享数据
C++中通过实例化std::mutex创建互斥量,通过调用成员函数lock()进行上锁,unlock()进行解锁。不过,不推荐实践中直接去调用成员函数,因为调用成员函数就意味着,必须记住在每个函数出口都要去调用unlock(),也包括异常的情况。C++标准库为互斥量提供了一个RAII语法的模板类std::lock_guard,其会在构造的时候提供已锁的互斥量,并在析构的时候进行解锁,从而保证了一个...原创 2019-04-27 00:38:34 · 2531 阅读 · 0 评论 -
c++11 yield函数的使用
yield函数时c++11的新特性,它在std::this_thread::yield命名空间中实现,函数声明如下:void yield() noexcept; 其作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行比如说你的线程需要等待某个操作完成,如果你直接用一个循环不断判断这个操作是否完成就会使得这个线程占满CPU时间,这会造成资源浪费。这时候你可以判断一次操作是否完成原创 2018-02-03 12:50:17 · 21310 阅读 · 4 评论 -
c++11中thread join和detach的区别
线程状态:在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的:1)就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行2)运行:占用CPU,正在运行中3)休眠:暂不参与调度,等待特定事件发生4)中止:已经运行完毕,等待回收线程资源线程环境:线程存在转载 2018-02-01 21:53:06 · 17799 阅读 · 2 评论 -
C++11中线程所有权转移分析
移动特性说明C++标准库中有很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std::thread都是可移动,但不可拷贝。移动拷贝或者移动赋值都使得原有对象对所属资源的控制权发生转移,从对象A转移到对象B,对资源的控制只在对象B中保留。以下是std::thread线程类的移动特性的声明,支持移动构造和移动对象,但不可拷贝。...原创 2019-04-21 00:52:59 · 1868 阅读 · 0 评论 -
C++11向线程函数传递参数
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );这个是std::thread构造函数之一,其中f是可调用对象,args是传递给f的参数。默认传递给f的是按值复制,若需要传递引用参数给线程函数,则必须包装它(例如用 s...原创 2019-04-20 17:26:05 · 9356 阅读 · 6 评论 -
C++11线程管理基础
1. 启动线程在C++ 11中线程是在std::thread对象创建时启动。因为我们把启动线程的重心放在如何构造这个thread对象,其构造函数有以下几个://仅仅是构造一个线程类,但没有和具体化的线程函数关联thread() noexcept;// 移动构造函数thread( thread&& other ) noexcept;//构造新的 std::thread 对...原创 2019-04-20 14:32:27 · 936 阅读 · 0 评论 -
c++11 thread类的简单使用
一个thread对象就代表一个线程执行,当对象创建完成后,线程函数就开始执行,下面这段话是c++11的thread类介绍。An initialized thread object represents an active thread of execution; Such a thread object is joinable, and has a unique thread id.A d原创 2018-02-01 22:47:42 · 1557 阅读 · 0 评论