随笔分类 -  多线程

加强线程的学习
摘要:一个好的解释, 原子操作是不能细分为更小部分的操作。因此,它永远不会半途而废,因此您可以保证它将始终以一致的状态被观察到。例如,现代硬件实现原子比较和交换操作。 互斥锁排除其他进程或线程执行同一段代码(关键段)。基本上,它确保最多一个线程执行给定的代码段。互斥锁也称为锁。 在幕后,锁必须以某种方式使 阅读全文
posted @ 2023-01-11 19:13 strive-sun 阅读(154) 评论(0) 推荐(0) 编辑
摘要:第一层:什么场景下需要异步 大量写操作占用了过多的资源,影响了系统的正常运行; 写操作异步后,不影响主流程,允许适当延迟; 第二层:异步的外功心法 本文提到了四种异步方式: 线程池模式 本地内存 + 定时任务 MQ 模式 Agent 服务 + MQ 模式 它们的共同特点是:将写操作命令存储在一个池子 阅读全文
posted @ 2022-07-13 11:06 strive-sun 阅读(99) 评论(0) 推荐(0) 编辑
摘要:尽量不使用无锁架构,除非绝对必要 复杂性中有一些东西吸引了每一位工程师。与常规同步机制(如互斥锁、条件变量、异步等)相比,无锁编程听起来非常性感。然而,与我交谈过的每一位经验丰富的 C++ 开发人员都认为,使用无锁编程作为首要手段是一种过早的优化形式,可能会在最合适的时候再次困扰你(想想当你没有完整 阅读全文
posted @ 2022-05-31 01:57 strive-sun 阅读(62) 评论(2) 推荐(0) 编辑
摘要:在 C++11 中,不要将 volatile 用于线程,仅限于 MMIO(内存映射) 简单的回答, 在声明变量类型之前添加 "volatile" 关键字不会使对该变量有任何方式的原子操作或者线程安全,我们需要使用 std::atomic 详细的解释, 参考:When to use volatile 阅读全文
posted @ 2022-05-31 01:51 strive-sun 阅读(48) 评论(0) 推荐(0) 编辑
摘要:在 async 任务中抛出的异常会被 std::future::get() 触发 #include <future> #include <iostream> int main() { std::future<int> myFuture = std::async(std::launch::async, 阅读全文
posted @ 2022-05-31 01:43 strive-sun 阅读(70) 评论(0) 推荐(0) 编辑
摘要:std::async 在简单的 IO 上比 std::thread 更有优势 前提:如果我们只需要一些异步执行的代码,这样不会阻塞主线程的执行,最好的办法是使用 std::async 来执行这些代码。这些操作我们也可以使用 std::thread 创建线程并通过函数指针 或者 lambda 参数将可 阅读全文
posted @ 2022-05-28 16:04 strive-sun 阅读(151) 评论(0) 推荐(0) 编辑
摘要:不要在对时间敏感的上下文中使用 .get() 先看下面的代码, #include "stdafx.h" #include <future> #include <iostream> int main() { std::future<int> myFuture = std::async(std::lau 阅读全文
posted @ 2022-05-28 15:31 strive-sun 阅读(96) 评论(0) 推荐(0) 编辑
摘要:前提: C++ 11 中提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多线程库对应的头文件是 #include <thread>,类名为 std::thread。 然而线程毕竟是比较贴近系统的东西,使用起来仍然不是很方便,特别是线程同步及获取线程运行结果上就更加麻 阅读全文
posted @ 2022-05-28 14:38 strive-sun 阅读(1220) 评论(0) 推荐(0) 编辑
摘要:线程中的异常可以使用 std::rethrow_exception 抛给主线程 问题分析:一个线程中抛出的异常是没法被另一个线程捕获的。假如我们在主线程中创建一个子线程,子线程中的函数抛出了异常,主线程的 catch 是不会触发,如下, #include<iostream> #include<thr 阅读全文
posted @ 2022-05-22 18:37 strive-sun 阅读(488) 评论(0) 推荐(0) 编辑
摘要:有时候使用 std::atomic 比使用 mutexes 更高效 问题分析:使用多线程更新一些简单数据时,比如 int 型,bool 型等等,可以使用 std::atomic,这比 mutex 来得更为高效。 比如,我们一般这样用: int counter; .... mu.lock(); cou 阅读全文
posted @ 2022-05-22 15:20 strive-sun 阅读(103) 评论(0) 推荐(0) 编辑
摘要:不要重复获取同一个锁 问题:在获得一个锁并且没有释放该锁的前提下,再次尝试获取该锁会报错。 比如, #include <iostream> #include <thread> #include <mutex> std::mutex mu; static int counter = 0; void S 阅读全文
posted @ 2022-05-22 15:13 strive-sun 阅读(88) 评论(0) 推荐(0) 编辑
摘要:要以相同顺序获取多个锁 多线程在加锁解锁时,可能会出现死锁问题,比如, 线程 1 在加锁 mutex A 后,继续尝试获取 mutex B,而 mutex B 已经被线程 2 获取,而线程 2 在等待获取 mutex A,mutex B 只有线程 2 获取 mutex A 后才能解锁, 这就导致线程 阅读全文
posted @ 2022-05-20 11:31 strive-sun 阅读(128) 评论(0) 推荐(0) 编辑
摘要:加锁的临界区要尽可能的紧凑和小型 问题分析: 当一个线程在临界区内执行时,所有其他试图进入临界区的线程都会被阻止,所以我们应该保证临界区尽可能的小。比如, void CallHome(string message) { std::lock_guard<std::mutex> lock(mu); // 阅读全文
posted @ 2022-05-19 11:28 strive-sun 阅读(47) 评论(0) 推荐(0) 编辑
摘要:要记得对加锁的临界区解锁 前提:在多个线程共享一块资源或者数据时,我们需要加上互斥锁来保护临界区(否则出现数据未定义的行为) 问题:我们往往在写了很多代码之后忘记 unlock 互斥锁,那么等待该资源的所有其他线程将被无限期地阻塞,程序可能会挂起 解决方法:使用 RAII 类型的 std::lock 阅读全文
posted @ 2022-05-18 15:14 strive-sun 阅读(59) 评论(0) 推荐(0) 编辑
摘要:对共享的资源或者数据做加锁处理 在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为。 比如: #include <iostream> #include <string> #include <thread> #include <mutex> using 阅读全文
posted @ 2022-05-17 11:49 strive-sun 阅读(93) 评论(0) 推荐(0) 编辑
摘要:传递给 C++ 线程的构造函数的参数是通过值传递的 VS 平台:2019 问题:如何在线程中改变传递的参数值? 比如: #include <functional> #include <iostream> #include <string> #include <thread> void ChangeC 阅读全文
posted @ 2022-05-16 11:05 strive-sun 阅读(63) 评论(0) 推荐(0) 编辑
摘要:试图 join 一个已经 detach 的线程 如果你已经在某个地方分离了线程,那你不可以在主线程再次 join,这是一个明显的错误 比如: #include <iostream> #include <thread> using namespace std; void LaunchRocket() 阅读全文
posted @ 2022-05-13 18:41 strive-sun 阅读(112) 评论(0) 推荐(0) 编辑
摘要:在终止程序之前没有使用 join() 等待后台线程 前提分析:线程分为 joinable 状态和 detached 状态 添加 .join() 这句代码的时候,就表示主线程需要等待子线程运行结束回收掉子线程的资源后,再往下运行,否则就会产生一种情况:当子线程还没有运行完主线程先运行完了,那么就会结束 阅读全文
posted @ 2022-05-13 17:16 strive-sun 阅读(1192) 评论(2) 推荐(0) 编辑
摘要:1. 进程与线程的关系,图解 进程简单理解就是我们平常使用的程序,进程拥有自己独立的内存空间地址,拥有一个以上的线程。 线程可以理解为轻量级的进程,是程序执行的最小单元。在某个进程启动后,会默认产生一个主线程,主线程可以创建多个子线程,因此线程是存在进程内的,位于一个进程内的线程可以共享部分资源,故 阅读全文
posted @ 2021-02-07 21:03 strive-sun 阅读(234) 评论(0) 推荐(0) 编辑

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