并发编程两种模型:
1. 消息通讯
2. 共享内存
同步原则:
1. 减少共享对象,使用不可变对象
2. 使用高级并发组件
3. 只使用互斥与条件变量
互斥器
1.lock和unlock交给栈上的Guard对象的构造和析构负责
(保证在同一个函数同一个区域内加锁解锁)
2.看函数调用栈能分析加锁情况
3.不使用嵌套锁
4.RAII封装锁
5.加锁和解锁在同一个线程
死锁
- 两个锁,加锁顺序相反
- 嵌套调用重复加锁
条件变量
条件变量首先要确定条件,且条件唯一作为wait
1.wait端
必须与mutex一起使用
必须已经上锁
判断条件必须使用while,且wait在while里
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%的线程同步问题。
如果遭遇到哲学家那样的问题,可以使用一个管理线程去负责同步,而不要每个线程作为一个哲学家的策略。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。