找回密码
 立即注册

QQ登录

只需一步,快速开始

WantSong
高级会员   /  发表于:2010-1-25 09:24:00
11#
是你的锁机制有问题,一把锁就能解决问题。你需要考虑,你的代码哪些是在锁中哪些不是在锁中。
换言之:
lock(xxxx)
{
....
}
-----
locker.lock();
try
{
  ....
}
finally
{
     locker.unlock();
}
在花括号中“...”的,才是受到保护的。

共享锁一般只在拥有事务概念的场合下出现,比如数据库应用。大多数的应用,读写会用一套标准;或者使用写锁,而不限制读。
而在有事务出现的时候,往往这个隔离机制就会更复杂,不是一两个锁就能解决问题的。

>其实加两把锁比加一把实际,是因为,两把锁能够锁得更“牢固”些!肯定比一把锁好嘛。
就像你家的门上加两把锁一样,好处和坏处都是显而易见的。
龙灯花鼓夜,长剑走天涯。
回复 使用道具 举报
WantSong
高级会员   /  发表于:2010-1-26 14:02:00
12#
关于楼主的例子,我不知道是基于什么语言环境的。因为s-lock或者X-lock的,都不是线程安全的。在真实环境中,对于True或者False的判断或赋值,可能得不到你想要的效果。
如果不使用语言提供的机制,要单独做这样一个线程安全机制,我有一个办法,提供第三个线程以专门维护需要线程安全的变量状态。其他线程需要访问这些变量时,都通过这第三个线程。
龙灯花鼓夜,长剑走天涯。
回复 使用道具 举报
Colin
社区贡献组   /  发表于:2010-1-26 16:38:00
13#
呵呵,理论上,如果不依赖于CPU的提供的同步机制,是无法实现安全的锁的。就你上面的例子,考虑在双核的情况下,完全可能在在线程A执行到第二个While循环的时候,线程B正好在设置X锁。这时候,A读出的数据还是11

呵呵,只要染上并行计算,都属于脑保健体操范畴的问题。绞脑汁啊。记下已有的范式,生搬硬套有时候还是会犯错。所以还是尽可能写没有SideEffect的代码比较安全。
回复 使用道具 举报
WantSong
高级会员   /  发表于:2010-1-26 17:10:00
14#
>如果不使用语言提供的机制,要单独做这样一个线程安全机制,我有一个办法,提供第三个线程以专门维护需要线程安全的变量状态。其他线程需要访问这些变量时,都通过这第三个线程。
对不起,要是想在这三个线程中实现同步,还是需要语言提供的机制,或者用(也许)更低级的语言开发出相关的机制。
龙灯花鼓夜,长剑走天涯。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部