每个线程会在进程的堆上创建的,栈之间有隔离区。
栈是默认线程独占的,而堆是共享资源,很多函数会有的缓冲区就在堆中的他是共享的。
每个线程栈和共享资源都可以看作是一个状态机。
并发导致了每条指令的执行变得不确定,程序的状态机状态是指数级增加的。
另外编译器会优化代码,导致理解并发更加困难,虽然可以通过使用汇编或者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);
}
对于增加全局计数器的情况,可以通过添加一个局部锁,设定一个临界值,达到临界值后再添加到全局变量中。
只有真正的临界区才需要加锁,这样既可以提高效率,也能减少出错的可能
再锁的内部,可以优化返回路径减少检查函数返回的地方,从而减少出错的可能