原子操作
概念
- 所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何context switch
- 原子操作可以保证正在工作的动作不被打断,即一旦开始,持续到结束。对比互斥锁优势在于,原子操作是在C/C++的层面,是无锁操作,既能解决并发问题,又不会导致死锁
原理
- X86平台,CPU提供了在指令执行期间对总线加锁的手段。
- CPU有一根引线
#HLOCK pin
连接到北桥,如果汇编语言的程序在一条指令前面加上了LOCK前缀,经过汇编以后的机器代码就会使CPU在执行这条指令的时候把#HLOCK pin
的电位拉低,持续到这条指令结束时放开,从而把线程锁住 - 这样,同一线程上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性
- CPU有一根引线
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
std::vector<std::thread> g_t_; void add_value_test() { int value = 0; auto f = [&](const char* name, int index) { for (int i = 0; i < 10000; i++) { ++value; std::this_thread::sleep_for(std::chrono::milliseconds(5)); std::cout << name << index << " value is : " << value << std::endl; } }; for (int i = 0; i < 100; i++) { g_t_.push_back(std::move(std::thread(f, "thread", i))); } for (int i = 0; i < 100; i++) { g_t_[i].join(); } std::cout << "value is :" << value << std::endl; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
std::vector<std::thread> g_t_; void add_value_test() { std::atomic<int> value(0); auto f = [&](const char* name, int index) { for (int i = 0; i < 10000; i++) { ++value; std::this_thread::sleep_for(std::chrono::milliseconds(5)); std::cout << name << index << " value is : " << value.load() << std::endl; } }; for (int i = 0; i < 100; i++) { g_t_.push_back(std::move(std::thread(f, "thread", i))); } for (int i = 0; i < 100; i++) { g_t_[i].join(); } std::cout << "value is :" << value.load() << std::endl; } |
检测内存泄露的工具
VLD
- Debug模式,链接vld.lib库,在代码加入头文件
LeakDiag
UMDH
发给子线程的消息主线程能不能捕获
多个子线程,读一个全局布尔变量
shared_ptr循环引用
lambda
windbg
windows调试工具
CoCreateInstance实现
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 2025_03_2503/25
- ♥ 2023_02_2002/20
- ♥ 2020_04_2905/01
- ♥ 2023_02_1502/20
- ♥ 2020_04_2804/28
- ♥ 2023_02_2703/06