线程同步规则

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

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

互斥器

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

死锁

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

条件变量

条件变量首先要肯定条件,且条件惟一做为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%的线程同步问题。
若是遭遇到哲学家那样的问题,能够使用一个管理线程去负责同步,而不要每一个线程做为一个哲学家的策略。资源

相关文章
相关标签/搜索