每个线程会在进程的堆上创建的,栈之间有隔离区。

栈是默认线程独占的,而堆是共享资源,很多函数会有的缓冲区就在堆中的他是共享的。

每个线程栈和共享资源都可以看作是一个状态机。

并发导致了每条指令的执行变得不确定,程序的状态机状态是指数级增加的。

另外编译器会优化代码,导致理解并发更加困难,虽然可以通过使用汇编或者volatile控制编译器的行为,但是还是要慎重

mutex解决资源访问的互斥性

条件变量解决了资源访问的同步性

void produce(){
    mutex_lock(&lock);
    while(!(cond)){
        cond_wait(&cv, &lock);
    }
    assert(cond);
    do_something();
    cond_broadcast(&cv);
    mutex_unlock(&lock);
}
void consumer(){
    mutex_lock(&lock);
    while(!(cond_consumer)){
        cond_wait(&cv,&lock);
    }
    assert(cond_consumer);
    consume();
    cond_broadcast(&cv);
    mutex_unlock(&lock);
}

对于增加全局计数器的情况,可以通过添加一个局部锁,设定一个临界值,达到临界值后再添加到全局变量中。

只有真正的临界区才需要加锁,这样既可以提高效率,也能减少出错的可能

再锁的内部,可以优化返回路径减少检查函数返回的地方,从而减少出错的可能