日期:2014-05-17  浏览次数:20962 次

自旋锁,互斥锁,信号量。这些用原子操作就一定安全了吗??
1.自旋锁会导致死锁。
2.互斥锁难道不会发生一个信号先获取了锁之后没来的及关闭锁,然后另外一个信号正好在这个瞬间拿了互斥锁。这样会产生的问题就是信号的信息会被另一个信号给刷掉了。

原子级的操作我看有人说这样就可以100%保证安全,不会出现问题了(其实进程通信出现的问题也就上面那两个)。这个是真的吗?我没有找到推翻这个观点的理论,各位能不能帮忙看看。谢谢。

------解决方案--------------------
1、任何锁,如果使用不当,都会造成死锁。
2、互斥锁本身是安全的,操作系统保证该操作的原子性。

进程间的同步一般不用SpinLock,因为进程间的内存是隔离的。
进程间的同步可以用命名事件命名互斥锁等。

------解决方案--------------------
引用:
1.自旋锁会导致死锁。
2.互斥锁难道不会发生一个信号先获取了锁之后没来的及关闭锁,然后另外一个信号正好在这个瞬间拿了互斥锁。这样会产生的问题就是信号的信息会被另一个信号给刷掉了。

原子级的操作我看有人说这样就可以100%保证安全,不会出现问题了(其实进程通信出现的问题也就上面那两个)。这个是真的吗?我没有找到推翻这个观点的理论,各位能不能帮忙看看。谢谢。

1 是锁就能导致死锁。
2 互斥锁要是连这都保证不了要它做什么,你说的问题CLR帮你解决了,要怀疑就不要用.NET了。
------解决方案--------------------
你说的第2种情况已经违背了互斥锁的原则
所谓原子级,就是操作不能再分割,CLR的内部实现还是很可靠的,只要不是使用不当就不用担心
------解决方案--------------------
1.单纯的自旋锁不可能产生真实的死锁,最多就是产生某种概率的死锁表象。
2.如果如LZ所说,那还能叫互斥锁吗?