随笔分类 -  C++

有关C++中的常见问题
摘要:操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。有些 CPU 的指令是非常危险的,一旦用错可能导致系统崩溃。如果所有的程序都可以任意使用这些指令,那么系统崩溃的概率将大大增加。为了保证内核的安全,操作系统一般都禁止用户进程直接操 阅读全文
posted @ 2022-09-05 14:13 strive-sun 阅读(1621) 评论(0) 推荐(1) 编辑
摘要:第一层:什么场景下需要异步 大量写操作占用了过多的资源,影响了系统的正常运行; 写操作异步后,不影响主流程,允许适当延迟; 第二层:异步的外功心法 本文提到了四种异步方式: 线程池模式 本地内存 + 定时任务 MQ 模式 Agent 服务 + MQ 模式 它们的共同特点是:将写操作命令存储在一个池子 阅读全文
posted @ 2022-07-13 11:06 strive-sun 阅读(99) 评论(0) 推荐(0) 编辑
摘要:项目线上出现了闪退问题,查看日志发现是 sentry 模块出问题了 因为用户电脑上没有 pdb 文件,所以无法加载具体函数的调用位置,只能手动去计算 具体步骤是:在 windbg.exe 中加载 sentry.dll 和 sentry.pdb 文件后 使用 lm 命令行拿到 sentry 模块的基地 阅读全文
posted @ 2022-07-08 21:20 strive-sun 阅读(94) 评论(0) 推荐(0) 编辑
摘要:更新项目版本号时,需要与 rc 文件的 version 同步,比较方便的方法是直接从 rc 文件中获取版本号,并应用到程序中 // 删除日志检查 bool GetVersion() { // get the filename of the executable containing the vers 阅读全文
posted @ 2022-07-07 11:16 strive-sun 阅读(605) 评论(0) 推荐(0) 编辑
摘要:{} 可以用于初始化 C++11 中的变量,就像它们用于初始化 C 中的数组和结构一样。 {} 主要是为了提供语法的一致性(使用 {} 初始化将在所有上下文中都有效,而使用赋值运算符或()初始化将在特定上下文中有效) {} 初始化还有一个优点,它可以防止缩小范围,即当需要 double 型时,它可以 阅读全文
posted @ 2022-07-06 18:57 strive-sun 阅读(1199) 评论(0) 推荐(0) 编辑
摘要:项目搭建时,发现在使用高版本 sentry-cli 上传 pdb 文件后会报 404 错误,同事猜测高版本的 sentry-cli 会返回错误的地址,建议我用低版本的试一下 依据教程,我在 windows 上安装 1.72.2 的 sentry-cli curl -sL https://sentry 阅读全文
posted @ 2022-06-28 15:54 strive-sun 阅读(1002) 评论(0) 推荐(0) 编辑
摘要:官方的解释 “Cronet is the networking stack of Chromium put into a library for use on mobile. This is the same networking stack that is used in the Chrome b 阅读全文
posted @ 2022-06-24 15:31 strive-sun 阅读(2165) 评论(0) 推荐(0) 编辑
摘要:今天在编译项目时,代码审查提示 “Single-parameter constructors should be marked explicit” 于是就在构造函数前加上 explicit 下面为最小的示例,这个示例主要是按文件创建时间排序并删除过期的文件 #include <iostream> # 阅读全文
posted @ 2022-06-22 18:15 strive-sun 阅读(384) 评论(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 阅读(49) 评论(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 阅读(152) 评论(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 阅读(97) 评论(0) 推荐(0) 编辑
摘要:前提: C++ 11 中提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多线程库对应的头文件是 #include <thread>,类名为 std::thread。 然而线程毕竟是比较贴近系统的东西,使用起来仍然不是很方便,特别是线程同步及获取线程运行结果上就更加麻 阅读全文
posted @ 2022-05-28 14:38 strive-sun 阅读(1239) 评论(0) 推荐(0) 编辑
摘要:线程中的异常可以使用 std::rethrow_exception 抛给主线程 问题分析:一个线程中抛出的异常是没法被另一个线程捕获的。假如我们在主线程中创建一个子线程,子线程中的函数抛出了异常,主线程的 catch 是不会触发,如下, #include<iostream> #include<thr 阅读全文
posted @ 2022-05-22 18:37 strive-sun 阅读(491) 评论(0) 推荐(0) 编辑
摘要:有时候使用 std::atomic 比使用 mutexes 更高效 问题分析:使用多线程更新一些简单数据时,比如 int 型,bool 型等等,可以使用 std::atomic,这比 mutex 来得更为高效。 比如,我们一般这样用: int counter; .... mu.lock(); cou 阅读全文
posted @ 2022-05-22 15:20 strive-sun 阅读(105) 评论(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 阅读(90) 评论(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) 编辑

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