并发编程两种模型:
1. 消息通信
2. 共享内存编程
同步原则:
1. 减小共享对象,使用不可变对象
2. 使用高级并发组件
3. 只使用互斥与条件变量并发
1.lock和unlock交给栈上的Guard对象的构造和析构负责
(保证在同一个函数同一个区域内加锁解锁)
2.看函数调用栈能分析加锁状况
3.不使用嵌套锁
4.RAII封装锁
5.加锁和解锁在同一个线程函数
条件变量首先要肯定条件,且条件惟一做为wait线程
1.wait端
必须与mutex一块儿使用
必须已经上锁
判断条件必须使用while,且wait在while里code
int dequeue() { MutexLockGuard lock(mutex); while(queue.empty()) { cond.wait(); } assert(!queue.empty()); int top = queue.front(); queue.pop_front(); return pop; }
2.broadcast端
不必定在上锁状况signal
在signal前必定要修改布尔表达式
修改布尔表达式必须上锁对象
broadcast代表状态变化,signal表示资源可用内存
void enqueue(int x) { MutexLockGuard lock(mutex); queque.push_back(x); cond.notify(); }
通常生产者和消费者的模型能够解决80%的线程同步问题。
若是遭遇到哲学家那样的问题,能够使用一个管理线程去负责同步,而不要每一个线程做为一个哲学家的策略。资源