多线程
线程不是越多越好,每个线程有有一个独立的堆栈空间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