跳至主要內容

线程的其他补充

LincZero大约 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源码分析

构造函数是一个右值引用的可变参数模板,接受右值参数

其他暂略

00