随笔分类 - C++
有关C++中的常见问题
摘要:加锁的临界区要尽可能的紧凑和小型 问题分析: 当一个线程在临界区内执行时,所有其他试图进入临界区的线程都会被阻止,所以我们应该保证临界区尽可能的小。比如, void CallHome(string message) { std::lock_guard<std::mutex> lock(mu); //
阅读全文
摘要:发现问题的经过: 公司开发的 windows 程序在启动运行时,在右下角的托盘里右键程序图标退出后,在重新启动程序后,因为防多次启动机制(锁原理),会提示该程序已经在运行中 但是托盘里已经找不到程序的图标,并且任务管理器的进程选项卡也无法找到,最终在任务管理器的详细信息选项卡中找到了该进程,强制结束
阅读全文
摘要:要记得对加锁的临界区解锁 前提:在多个线程共享一块资源或者数据时,我们需要加上互斥锁来保护临界区(否则出现数据未定义的行为) 问题:我们往往在写了很多代码之后忘记 unlock 互斥锁,那么等待该资源的所有其他线程将被无限期地阻塞,程序可能会挂起 解决方法:使用 RAII 类型的 std::lock
阅读全文
摘要:对共享的资源或者数据做加锁处理 在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为。 比如: #include <iostream> #include <string> #include <thread> #include <mutex> using
阅读全文
摘要:传递给 C++ 线程的构造函数的参数是通过值传递的 VS 平台:2019 问题:如何在线程中改变传递的参数值? 比如: #include <functional> #include <iostream> #include <string> #include <thread> void ChangeC
阅读全文
摘要:试图 join 一个已经 detach 的线程 如果你已经在某个地方分离了线程,那你不可以在主线程再次 join,这是一个明显的错误 比如: #include <iostream> #include <thread> using namespace std; void LaunchRocket()
阅读全文
摘要:在终止程序之前没有使用 join() 等待后台线程 前提分析:线程分为 joinable 状态和 detached 状态 添加 .join() 这句代码的时候,就表示主线程需要等待子线程运行结束回收掉子线程的资源后,再往下运行,否则就会产生一种情况:当子线程还没有运行完主线程先运行完了,那么就会结束
阅读全文
摘要:std::shared_ptr<int> a = std::make_shared<int>(2); std::weak_ptr<int> b = a; a = nullptr; if (std::shared_ptr<int> b_lock = b.lock()) std::cout << *b_
阅读全文
摘要:官方文档:https://github.com/getsentry/sentry-native 虽说官方文档有搭建步骤,奈何我用 git bash 试了 n 遍,最终都会报一大堆错误,白白浪费了我快一个下午的时间 最终找到了一位大哥的博客,里面也介绍了他遇到的坑,跟随他的方法,编译成功了 遂把一些更
阅读全文
摘要:31. Minimize complilation dependencies between files(handle class & interface class) 这部分需要记录下来, Handle classes #include <string> #include <memory> cla
阅读全文
摘要:1. auto_ptr 不建议使用的原因: auto_ptr 采用 copy 语义来转移指针资源,转移指针资源的所有权的同时将原指针置为 nullptr,这跟通常理解的 copy 行为是不一致的(不会修改原数据),而这样的行为在有些场合下不是我们希望看到的。 例如参考《Effective STL》第
阅读全文
摘要:#include <iostream> #include <string> #include <vector> std::shared_ptr<std::vector<std::string>> AssignValue() { std::vector<std::string> str_v1; std
阅读全文
摘要:void Utf8ToUtf8Bom(const wchar_t* filename) { std::ifstream infile; std::string strline; std::string strresult; // BOM HEADER char c1 = (char)0xEF; ch
阅读全文
摘要:编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application p
阅读全文
摘要:举个简单的例子: Unicode 只是一个业界标准,具体一个字符占多少字节,取决于编码方式,包括 UTF-8 UTF-16 GB2312 等 “汉” 在 UTF-8 中占到 3 个字节,即 E6 B1 89 在 GB2312 中占到 2 个字节,即 BA BA,一般我们的电脑都是以 GB2312 编
阅读全文
摘要:书籍: 现代 C++ 教程 日常查阅资料看到的有用文章链接: C++11新特性总结(相比C++98) C++ 智能指针的正确使用方式 对于智能指针的使用,实际上是对所有权和生命周期的思考,一旦想明白了这两点,那对智能指针的使用也就得心应手了。 https://suzulang.com/try-lib
阅读全文
摘要:先介绍一篇有用的文章,来自外网,这里简单翻译一下, Data Alignment 什么是数据对齐? 在编程语言中,一个数据对象(变量)有两个属性;它的值和存储位置(地址)。数据对齐是指数据的地址可以被1、2、4或8整除。换句话说,数据对象可以有1字节、2字节、4字节、8字节对齐或任何幂2. 比如一个
阅读全文