线程的其他补充
大约 2 分钟
线程的其他补充
Condition_variable、wait、notify_one、notify_all
条件变量std::condition、wdit()、notify_one()
上述代码深入思考
notify_all
async、future、packaged_task、promise
std::async、std::future创建后台任务并返回值
std::packaged_task
std::promise
小结
future其他成员函数、shared_future、atomic
std::future的其他成员函数
std::shared_future
原子操作std::atomic
原子操作概念引出范例
基本的std::atomic用法范例
心得总结
std::atomic续谈、std::async深入谈
原子操作std::atomic续谈
深入谈std::async
std::async参数详述
std::async和std::thread的区别
std::async不确定性问题的解决
windows临界区、其他各种mutex互斥量
windows临界区
多次进入临界区试验
自动析构技术
recursive_mutex递归的独占互斥量
带超时的互斥量std::timed_mutex和std::recursive_timed_mutex
补充知识、线程池浅谈、数量谈、总结
补充知识点
虚假唤醒
atomic
浅谈线程池
场景设想
实现方式
线程创建数量谈
C++11多线程总结
多线程 - 线程的其他补充
线程操作补充
自带锁的数据 - 新版list
线程管理
线程id
线程id
- 线程id可以通过
std::this_thread::get_id();
来获取
踩坑问题
引用问题
例程:
#include <iostream>
#include <thread> // 线程头文件
using namespace std;
class TA
{
public:
int &m_i; // 【新增】引用对象
TA(int &i):m_i(i) {} // 【新增】构造函数
void operator()() // 线程的初始函数(类成员函数),不能带参数!!!
{
cout << "子线程" << endl;
cout << "m_i:" << m_i << endl; // 【新增】每次输出时m_i的值都不一样
}
}
int main() // main函数,主线程的初始函数
{
int myi = 6; // 【新增】
Ta ta(myi); // 【修改】传入引用对象
/* std::thread mythread(Ta()); // 这里用匿名对象也是可以的 */
std::thread mythread(ta); // 函数、类、Lambda都是可调用对象
mythread.detach();
cout << "主线程" << endl;
return 0;
}
Q:为什么每次输出时m_i的值都不一样
A:原因:detach后主线程执行完后,m_i的内存被回收销毁,此时m_i的内存的值不可控
对象拷贝问题
Q:使用detach()后,当主线程结束对象被销毁,子线程还能使用这个对象的成员函数吗
A:对象会被复制到线程中生成新对象 前面的例程从开始到结束发生了:一次构造函数、一次拷贝构造函数、两次析构函数 (这里拷贝构造函数默认是浅拷贝,对象中有引用对象的要注意重写复制构造函数来深拷贝,否则会发生前面的问题)
Thread源码分析
构造函数是一个右值引用的可变参数模板,接受右值参数
其他暂略