Jian's Note

It's better to burn out than fade away!

C++ Concurrency in Action [5] | CH05 C++ Memory Model and Operations on Atomic Types

内存模型基础 为了避免 race condition,线程就要规定执行顺序。一种方式是使用 mutex,后一线程必须等待前一线程解锁。第二种方式是使用原子操作来避免竞争访问同一内存位置 原子操作是不可分割的操作,要么做了要么没做,不存在做一半的状态。如果读取对象值的加载操作是原子的,那么对象上的所有修改操作也是原子

C++ Concurrency in Action [4] | CH04 Synchronizing concurrent operations

条件变量(condition variable) 在并发编程中,一种常见的需求是,一个线程等待另一个线程完成某个事件后,再继续执行任务。对于这种情况,标准库提供了 std::condition_variable 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include <condition_variable> #include <iostream> #include <mutex> #include <thread> class A { public: void step1() { { std::lock_guard<std::mutex> l(m_); step1_done_ = true; } std::cout <<

C++ Concurrency in Action [3] | CH03 Sharing Data Between Threads

线程间共享数据存在的问题 不变量(invariant):关于一个特定数据结构总为 true 的语句,比如 双向链表的两个相邻节点 A 和 B,A 的后指针一定指向 B,B 的前指针一定指向 A。有时程序为了方便会暂时破坏不变量,这通常发生于更新复杂数据结构的过程中,比如删除双向链表中的一个节点 N,要先让 N 的前一个节点指向 N 的后

C++ Concurrency in Action [2] | CH02 Managing Threads

std::thread 每个程序有一个执行 main() 函数的主线程,将函数添加为 std::thread 的参数即可启动另一个线程,两个线程会同时运行 1 2 3 4 5 6 7 8 9 #include <iostream> #include <thread> void f() { std::cout << "hello world"; } int main() { std::thread t{f}; t.join(); // 等待新起的线程退出 } std::thread 的参数也可以是函数对象或者 lambda 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> #include <thread> struct A { void operator()() const { std::cout << 1; } }; int main() { A a; std::thread t1(a); // 会调用 A 的拷贝

CMake 简介

1. 总览 什么是CMake? CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不相依于某特定编译器。并可支持多层目录、多个应用程序与多个库。 它用配置文件控制建构过程(build process)的方式和Unix的make相似,只是CMake的配置文件取名为CMakeLists.txt

Deformable DETR论文精读+代码详解

Abstract DETR消除了目标检任务中的手工设计痕迹,但是存在收敛慢以及Transformer的自注意力造成的特征图分辨率不能太高的问题,这就导致了小目标检测性能很差。我们的Deformable DETR只在参考点附近采样少量的key来计算注意力,因此我们的方法收敛快并且可以用到多尺度特征。 相对于Transfo

Effective Modern C++ 阅读笔记

Effective Modern C++ 笔记 CH01 Deducing Types Item 1: Understand template type deduction. 大部分简单场景下,我们根据模板调用可能一眼就能推导出来模板类型。但是,对于一些复杂场景,模板类型就没那么明显了,这就需要遵循一些基本原则。 1 2 3 4 template<typename T> void f(ParamType param); //..... f(expr); // call f with some expression 考虑以上代码片段,编译器在编译阶段根据调用点 expr 来推导出 T 和 ParamType 的类型。这其中 T 的推导不仅依赖 expr 的类型,

Effective STL 精读总结 [4] | 迭代器

前言 Effective-STL总结系列分为七部分,本文为第四部分,涉及原书第四章,内容范围Rule26~29。为方便书写,Rule26简写为R26。 Effective-STL系列List 本博客站点系列内容如下: 💡 Effective STL(第3版) 精读总结(一) 💡 Effective STL(第3版) 精读总结(二) 💡 Effective STL(第3版) 精

Effective STL 精读总结 [3] | 关联容器

前言 Effective-STL总结系列分为七部分,本文为第一部分,涉及原书第一章,内容范围Rule01~12。为方便书写,Rule12简写为R12。 Effective-STL系列List 本博客站点系列内容如下: 💡 Effective STL(第3版) 精读总结(一) 💡 Effective STL(第3版) 精读总结(二) 💡 Effective STL(第3版) 精

Effective STL 精读总结 [2] | vector 和 string

前言 Effective-STL总结系列分为七部分,本文为第一部分,涉及原书第一章,内容范围Rule01~12。为方便书写,Rule12简写为R12。 Effective-STL系列List 本博客站点系列内容如下: 💡 Effective STL(第3版) 精读总结(一) 💡 Effective STL(第3版) 精读总结(二) 💡 Effective STL(第3版) 精
0%