共享数据总是需要保护的。不论是对单处理器系统还是SMP系统,不论内核是否可以抢占,理由是显而易见的。临界区,竞争,同步的概念也不需要再多说。
原子操作,加锁是同步的基本方法。原子操作比较适合数据访问比较简单的场合,比方说增加或者减少一个计数器,甚至上锁/解锁本身也应该是原子的操作。
锁是自愿的非强制的,也就是说总是可以不加任何限制的访问数据,但是造成的后果必须自己承担,如果承担的起的话。
锁针对的对象应该是数据,而不是代码,虽然临界区本身指的是代码,但一个线程是否可以进入临界区是要检查所访问的数据是否被锁住而不是这段临界区是否被锁住,如果数据被锁住,线程就要堵塞,自然也就不会进入临界区,但并不是把临界区锁住了,如果把临界区锁住了,那么别的线程如何执行这段代码?在概念上这里是不应该混淆的。
既然有锁,自然就有死锁。死锁的概念和造成死锁的原因无需赘述。避免出现死锁大体上会有几个原则:总是按照一定的顺序申请锁,锁的释放顺序一般来说无关;如果申请锁失败,则需要释放已经持有的锁;避免多次申请同一把锁,因为不是所有的锁都是可以嵌套使用的。
最后,锁是串行化访问数据的一个工具,因此在某些情况下会是系统性能的瓶颈。
阅读(1391) | 评论(0) | 转发(0) |