C++11特性-多线程

多线程

        线程不是越多越好,每个线程有有一个独立的堆栈空间1M.线程切换需要保存很多中间状态

        商用程序的必须要求

并发的实现方法

        多进程并发:进程通信(同一电脑-文件、管道、共享内存、消息队列;不同电脑-socket)

        多线程并发: 单个进程,创建多个线程。通信(共享地址、指针、引用、全局变量)

        多线程开销  < 多进程开销

多线程数据共享

        只取数据:是安全的,不需要特别处理

        有读有写:程序如无其他处理,程序崩溃,简单处理是读写不同步

        共享数据保护:使用mutex互斥锁、信号量、边界条件

互斥量mutex与lock_guard

         某个线程锁住、操作数据、解锁,其他线程等待解锁、锁住、操作数据、解锁的步骤

        lock(),加锁,只有一个线程能加锁成功,成功就返回,没加锁成功就尝试加锁,unlock()解锁

        lock() 操作共享数据 unlock() 的操作步骤

        lock()与unlock()成对使用,先lock(),后unlock(),之间为数据操作

        std::lock_guard守卫者职能,可以同时替换lock与unlock,不能与lock或者unlock同时出现。lock_guard的构造函数执行lock,析构函数执行unlock,使用lock_guard的提前解锁使用{}作用域,结束其生命周期

        死锁:至少两个互斥量(即两个共享数据),两个线程都使用这两个互斥量,线程A先使用互斥A,线程2先使用互斥B

         死锁的解决方案:

                1.多个线程使用互斥量的顺序一样

                2.超时放弃

                3.std::lock(),一次锁住多个互斥量,一旦没锁住所有互斥量,就释放已锁住的互斥量

                        std::lock(mutex1,mutex2......)

        std::lock()与std::lock_guard配套使用        

                std::adopt_lock起一个标记作用,表示互斥量已将被lock,在构造时不再被lock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值