随笔分类 - C++11/14/17
C++ 新特性的经验记录和分享
C++ std::Recursive_mutex 支持 “对同一互斥量进行嵌套加锁”
摘要:使用场景:一个类的不同成员函数之间,存在相互调用的情况, 如果这样的成员函数作为线程的入口函数时,就会出现在成员函数 func1()中对某个互斥量上锁,并且, func1()中调用了成员函数 func2() ,实际上 func2()为了保护成员数据,func2()内部也对同一个互斥量上锁。 在我们对
阅读全文
采用C++17新标准 “共享锁”和“独占锁”更低消耗更好性能地保护不常更新的共享数据
摘要:用到的标准库: std::shared_lock<>、 std::shared_mutex、 std::lock_guard<>。 另外还有 std::shared_timed_mutex(此处不讲)。 分析:对于保护不常更新的共享数据, 因为写只是很偶然的发生,更频繁的是读取。如果不区分 “读者”
阅读全文
双重检查锁--声名狼藉, 臭名昭著
摘要:双重检查锁模式,是经常听到和用到的方式,既保护了数据的初始化过程,也避免了每次访问时,多个线程要序列化的检查锁问题。 不过,又有观点说,双重检查锁模式是声名狼藉,是臭名昭著的。下面我们通过例子来分析论证。直接贴代码,附上执行结果,我们先看效果,再做分析。 1 xxx.h 2 3 #include <
阅读全文
std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(5)
摘要:1 /* 2 * 话题1:使用互斥量保护共享数据 3 * 4 * 接下来学习第五个小话题:避免死锁的进阶指导 5 * 6 * 这一小节的内容,完全引用,只在最后补充上我对这部分的理解,以及更多一点的想法 7 */!!! 非常有意思的是下面讲到的 “使用锁的层次结构”。 锁的层次的意义在于提供对运行时
阅读全文
std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(4)
摘要:1 #ifndef DEADLOCK_QUESTIONDESCRIBLE_AND_SOLUTION_H 2 #define DEADLOCK_QUESTIONDESCRIBLE_AND_SOLUTION_H 3 4 /* 5 * 话题1:使用互斥量保护共享数据 6 * 7 * 接下来学习第四个小话题
阅读全文
C++多线程库的常用函数 std::lock()
摘要:格式:函数名 + 头文件 + 用例 + 解释说明 1 函数名: 2 std::lock() 3 4 头文件: 5 #include <mutex> 6 7 用例: 8 std::mutex ma, mb, mc; 9 std::lock(ma, mb, mc); 10 std::lock_guard
阅读全文
std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(3)
摘要:1 #ifndef LOCATE_INTERFACES_RACE_CONDITION 2 #define LOCATE_INTERFACES_RACE_CONDITION 3 4 /* 5 * 话题1:使用互斥量保护共享数据 6 * 7 * 接下来学习第三个小话题:定位接口间的条件竞争 8 * 9
阅读全文
std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(2)
摘要:1 #ifndef USE_CODE_PROTECTED_DATA_H 2 #define USE_CODE_PROTECTED_DATA_H 3 4 /* 5 * 话题1:使用互斥量保护共享数据 6 * 7 * 接下来学习第二个小话题:用代码来保护共享数据 8 * 9 * 从第一个小话题可以看到,
阅读全文
std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(1)
摘要:1 /* 2 * 话题1:使用互斥量保护共享数据 3 * 4 * 1. C++中使用互斥量 5 * 2. 用代码来保护共享数据 6 * 3. 定位接口间的条件竞争 7 * 4. 死锁:问题描述及解决方案 8 * 5. 避免思索的进阶指导 9 * 6. std::unique_lock 灵活的锁 10
阅读全文
C++多线程库的常用模板类 std::lock_guard
摘要:格式:类名 + 头文件 + 用例 + 解释说明 1 模板类类名: 2 std::lock_guard 3 4 头文件: 5 #include <mutex> 6 7 用例: 8 9 std::mutex m; 10 std::lock_guard<std::mutex> lk(m); 解释说明: C
阅读全文
C++多线程库的常用类 std::mutex
摘要:格式:类名 + 头文件 + 用例 + 解释说明 1 类名: mutex 2 3 头文件: #include <mutex> 4 5 用例; 6 std::mutex m_mutex; 解释说明: std::mutex C++提供的互斥量,用在多线程编程中,来保护共享数据。 C++中通过实例化std:
阅读全文
std::get<C++11多线程库~线程间共享数据>(09):共享数据带来的问题(1)
摘要:1 #include <QCoreApplication> 2 3 /* 4 * 话题1:线程间共享数据 5 * a. 共享数据带来的问题 6 * b. 使用互斥量保护数据 7 * c. 数据保护的替代方案 8 * 9 * 多个线程只读的访问某一个相同的数据,不会出现问题; 10 * 多个线程有读有
阅读全文
C++多线程库的常用函数 std::this_thread::get_id()
摘要:格式:函数 + 头文件 + 用例 + 解释说明 函数: std::this_thread::get_id() 头文件: <thread> 用例: std::thread::id master_thread = std::this_thread::get_id(); 另一种获取线程标识符 id 的办法
阅读全文
C++多线程库的常用函数积累和整理
摘要:std::this_thread::get_id() 获取线程标识符 std::thread::hardware_concurrenc() 获取硬件能够支持的一个应用程序最对的线程数量 C++多线程库的常用类 std::mutex C++提供的互斥量,用在多线程编程中,来保护共享数据。 C++多线程
阅读全文
C++多线程库的常用函数 std::thread::hardware_concurrency()
摘要:格式:函数 + 头文件 + 用例 + 解释说明 1. 函数 std::thread::hardware_concurrency() 头文件 #include <thread> 用例 unsigned long const hardware_threads = std::thread::hardwar
阅读全文
std::get<C++11多线程库~线程管理>(08):转移线程所有权(2)
摘要:1 /* 2 * 话题1:基于“转移线程的所有权”,改进 thread_guard 类, 确保 std::thread 可以被 join或detach。 3 * 类 Scoped_thread 的构造函数把参数传递的 std::thread 拥有的所有权转移到自身成员变量上。 4 * 如果参数传递的
阅读全文
std::get<C++11多线程库~线程管理>(08):转移线程所有权(1)
摘要:1 #include <QCoreApplication> 2 #include <thread> 3 #include <iostream> 4 5 /* 6 * 话题1:转移线程的所有权。 7 * std::thread 构造函数需传入一个函数或可调用对象, 每一个 std::thread 都关
阅读全文
std::get<C++11多线程库>(07):向线程函数传递参数(5)
摘要:1 //! [3] *引用/指针 语义下变量地址情况回顾* 2 int main(int argc, char *argv[]){ 3 4 int a = 10; //0x4ffe28 5 int &refa = a; //0x4ffe28 6 int *pa = &a; //0x4ffe28 7
阅读全文
std::get<C++11多线程库>(07):向线程函数传递参数(4)
摘要:1 /* 2 * 问-思考: 3 * 1. std::thread 构造函数的第一个参数为重载函数时, 如何决定哪一个重载函数才是我们想要调用的? 4 */ 1 //! [0] * 问-思考-1 * 2 //! std::thread 构造函数的第一个参数为重载函数时, 如何决定哪一个重载函数才是我
阅读全文
std::get<C++11多线程库>(07):向线程函数传递参数(2)
摘要:1 /* 实例场景: 2 * 1. std::thread 构造函数的第一个参数为全局函数时,参数的传递。 3 * 传递方式:std::thread第一个参数为全局函数的函数指针, std::thread 从第二个开始的参数,依次传递给全局函数的参数表 4 * std::thread t(func,
阅读全文