多线程
c++ 使用线程注意事项
限定符避免编译器优化
参考限定符部分,不过没用好像也没什么问题// 线程操作对象需要增加volatile,避免编译器优化(直接从变量地址读取而不是上次的值) volatile int val;
锁同一个对象需要同一个锁,如全局变量或类对象
std::mutex mut //构造函数加锁,析构函数解锁,避免程序意外终止结果没来得及解锁 lock_guard<mutex> lock (mut);
sleep_for,线程休眠指定时间后唤醒,不过由于线程调度等原因,实际睡眠时间可能更长
std::this_thread::sleep_for( std::chrono::milliseconds(2000) );
- 线程销毁
- thread::join()调用后,调用它的线程会被block,直到线程的执行被完成.如果一个c++线程对象销毁时还可以join就会抛出异常
- thread::detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达—这是两个独立的事情.
- 执行到析构函数时要么join,要么detach线程
c++11院子操作(atomic operation)
所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义.确保同一时刻只有唯一的线程对指定的全局资源进行访问,
类似互斥锁,但是原子操作更加接近底层,因而效率更高.
使用非常简单,只是类型不一样,且不用加锁就能保证线程访问的安全性,类型包括atomic_bool,atomic_int等常用简单类型
#include <atomic>
atomic_long total(0);
total++;
引用
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 yangbenbo@whu.edu.cn
文章标题:多线程
本文作者:杨本泊
发布时间:2020-11-14, 21:07:02
最后更新:2023-07-09, 07:10:12
原始链接:http://yangbenbo.github.io/2020/11/14/多线程/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。