浅墨浓香

想要天亮进城,就得天黑赶路。
随笔 - 743, 文章 - 16, 评论 - 87, 阅读 - 53万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  Modern C++ 11/14

Effective Modern C++
摘要:一. std::atomic_flag和std::atomic (一)std::atomic_flag 1. std::atomic_flag是一个bool类型的原子变量,它有两个状态set和clear,对应着flag为true和false。 2. std::atomic_flag使用前必须被ATO 阅读全文

posted @ 2019-11-30 23:01 浅墨浓香 阅读(14490) 评论(1) 推荐(1) 编辑

摘要:一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立。当某个线程修改测试条件后,将通知其它正在等待条件的线程继续往下执行。 1. wait线程:如果不满足该条件,拥有条件变量的wait线 阅读全文

posted @ 2019-11-20 01:29 浅墨浓香 阅读(1677) 评论(0) 推荐(0) 编辑

摘要:一. 互斥量 (一)Mutex系列类 1. std::mutex:独占的互斥量,不能递归使用。 2. std::recursive_mutex:递归互斥量。允许同一线程多次获得该互斥锁,可以用来解决同一线程需要多次获取互斥量时死锁的问题。 3. std::time_mutex和std::recurs 阅读全文

posted @ 2019-11-17 14:07 浅墨浓香 阅读(2327) 评论(0) 推荐(0) 编辑

摘要:一. std::promise和std::package_task (一)共享状态、提供者和管理者 // CLASS TEMPLATE _Promise template <class _Ty> class _Promise { // class that implements core of pr 阅读全文

posted @ 2019-11-07 20:57 浅墨浓香 阅读(1252) 评论(0) 推荐(0) 编辑

摘要:一. “共享状态” (一)“共享状态”对象 1. 用于保存线程函数及其参数、返回值以及新线程状态等信息。该对象通常创建在堆上,由std::async、std::promise和std::package_task等提供(Provider),并交由future/shared_future管理。 2. P 阅读全文

posted @ 2019-10-26 16:05 浅墨浓香 阅读(1621) 评论(0) 推荐(0) 编辑

摘要:一. std::async函数模板 (一)std::async和std::thread的区别 1. 两者最明显的区别在于async采用默认启动策略时并不一定创建新的线程。如果系统资源紧张,那么std::thread创建线程可能失败,系统报告异常,整个程序可能崩溃。而std::async一般则不会,它 阅读全文

posted @ 2019-10-23 17:41 浅墨浓香 阅读(3004) 评论(0) 推荐(1) 编辑

摘要:一. 线程的等待与分离 (一)join和detach函数 1. 线程等待:join() (1)等待子线程结束,调用线程处于阻塞模式。 (2)join()执行完成之后,底层线程id被设置为0,即joinable()变为false。同时会清理线程相关的存储部分, 这样 std::thread 对象将不再 阅读全文

posted @ 2019-10-12 10:34 浅墨浓香 阅读(6864) 评论(0) 推荐(1) 编辑

摘要:一. std::thread类 (一)thread类摘要及分析 class thread { // class for observing and managing threads public: class id; using native_handle_type = void*; thread( 阅读全文

posted @ 2019-10-08 09:33 浅墨浓香 阅读(12384) 评论(0) 推荐(0) 编辑

摘要:一. make系列函数 (一)三个make函数 1. std::make_shared:用于创建shared_ptr。GCC编译器中,其内部是通过调用std::allocate_shared来实现的。 2. std::make_unique:C++14中加入标准库。 3. std::allocate 阅读全文

posted @ 2019-10-05 20:24 浅墨浓香 阅读(1056) 评论(0) 推荐(0) 编辑

摘要:一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp; //其中sp为shared_ptr类型 wp2 = wp1; //其中wp1为weak_ptr类型 (二)常 阅读全文

posted @ 2019-10-05 00:11 浅墨浓香 阅读(2965) 评论(0) 推荐(1) 编辑

摘要:一. shared_ptr的基本用法 (一)与unique_ptr的比较 比较 shared_ptr unique_ptr 备注 初始化 ①shared_ptr<T> sp; sp.reset(new T()); ②shared_ptr<T> sp(new T()); ③shared_ptr<T> 阅读全文

posted @ 2019-10-04 16:19 浅墨浓香 阅读(2401) 评论(0) 推荐(0) 编辑

摘要:一. unique_ptr的基本用法 (一)初始化方式 1. 直接初始化:unique<T> myPtr(new T); //ok。但不能通过隐式转换来构造,如unique<T> myPtr = new T()。因为unique_ptr构造函数被声明为explicit。 2. 移动构造:unique 阅读全文

posted @ 2019-10-03 11:09 浅墨浓香 阅读(4019) 评论(0) 推荐(2) 编辑

摘要:一. std::bind (一)std::bind实现的关键技术 【编程实验】探索bind原理,实现自己的bind函数 #include <iostream> #include <tuple> using namespace std; //1. 占位符定义 template<size_t idx> 阅读全文

posted @ 2019-09-06 19:30 浅墨浓香 阅读(3293) 评论(2) 推荐(5) 编辑

摘要:一. lambda的捕获方式 (一)3种捕获方式: 1. 按值捕获: [=]或[var],前者为按值的默认捕获方式 2. 按引用捕获:[&]或[&var],前者为按引用的默认捕获方式 3. 初始化捕获(C++14): 见后面的《广义捕获》及由其引申出来的移动捕获功能。这种捕获方式可以做到C++11中 阅读全文

posted @ 2019-08-21 18:46 浅墨浓香 阅读(1805) 评论(2) 推荐(1) 编辑

摘要:一. lambda表达式 (一)语法定义:[capture](paramters) mutable ->returnType{statement} 1.[capture]:捕获列表 (1)lambda函数只能捕获父作用域中的局部变量或形参。而捕获非父作用域或静态变量则会出错。(这里的父作用域指的是包 阅读全文

posted @ 2019-08-21 10:23 浅墨浓香 阅读(788) 评论(0) 推荐(0) 编辑

摘要:一.万能引用形参重载函数的问题 (一)当产生精确匹配时: C++的重载匹配是贪婪的,当形参为万能引用类型时,实例化过程中,它和几乎任何的实参类型都会产生精确匹配。 1. 根据重载匹配规则,精确匹配优先于类型转换的函数。一旦万能引用成为重载候选函数,就会吸引起大批的实参类型。因此,形参为万能引用的重载 阅读全文

posted @ 2019-08-19 16:45 浅墨浓香 阅读(943) 评论(0) 推荐(0) 编辑

摘要:一、理解引用折叠 (一)引用折叠 1. 在C++中,“引用的引用”是非法的。像auto& &rx = x;(注意两个&之间有空格)这种直接定义引用的引用是不合法的,但是编译器在通过类型别名或模板参数推导等语境中,会间接定义出“引用的引用”,这时引用会形成“折叠”。 2. 引用折叠会发生在模板实例化、 阅读全文

posted @ 2019-08-09 00:58 浅墨浓香 阅读(9089) 评论(7) 推荐(5) 编辑

摘要:一. std::move (一)std::move的原型 (二)注意事项 1. std::move的本质就强制类型转换,它无条件地将实参转为右值引用类型(匿名对象,是个右值),继而用于移动语义。 2. 该函数只是将实参转为右值,除此之外并没有真正的move任何东西。实际上,它在运行期没任何作为,编译 阅读全文

posted @ 2019-08-08 00:26 浅墨浓香 阅读(4379) 评论(1) 推荐(1) 编辑

摘要:一. 左值和右值 (一)概述 1. 左值是一般指表达式结束后依然存在的持久化对象。右值指表达式结束时就不再存在的临时对象。便捷的判断方法:能对表达式取地址、有名字的对象为左值。反之,不能取地址、匿名的对象为右值。 2. C++ 表达式(运算符带上其操作数、字面量、变量名等)有两种独立的属性:类型和值 阅读全文

posted @ 2019-08-06 12:22 浅墨浓香 阅读(1261) 评论(2) 推荐(0) 编辑

摘要:一. 特殊成员函数 (一)概述 1. 特殊成员函数指C++会自行生成的成员函数,主要有6种:默认构造函数、析构函数、复制构造函数、复制赋值函数、移动构造函数和移动赋值函数。 2. 默认生成的特殊成员函数都具有public访问权限且是inline的非虚函数(除析构例外)。通常,如果这些函数不被相关代码 阅读全文

posted @ 2019-08-03 15:07 浅墨浓香 阅读(980) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示