并发编程两种模型:
1. 消息通讯
2. 共享内存

同步原则:
1. 减少共享对象,使用不可变对象
2. 使用高级并发组件
3. 只使用互斥与条件变量

互斥器

1.lock和unlock交给栈上的Guard对象的构造和析构负责
(保证在同一个函数同一个区域内加锁解锁)
2.看函数调用栈能分析加锁情况
3.不使用嵌套锁
4.RAII封装锁
5.加锁和解锁在同一个线程

死锁

  1. 两个锁,加锁顺序相反
  2. 嵌套调用重复加锁

条件变量

条件变量首先要确定条件,且条件唯一作为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%的线程同步问题。
如果遭遇到哲学家那样的问题,可以使用一个管理线程去负责同步,而不要每个线程作为一个哲学家的策略。


LuCoder
10 声望1 粉丝

技术宅男