我试图在多线程环境中找到最好的相似性。
有没有更好的选择,或者两个版本在下面是一样的?
// float bestSimilarity is shared
// float _similarity is local
lock(locker)
if (_similarity > bestSimilarity)
bestSimilarity = _similarity;
vs
if (_similarity > bestSimilarity)
lock(locker)
bestSimilarity = _similarity;
发布于 2011-10-20 12:00:06
你的第一个案例将保证有效。然而,第二个案例可能会失败。你比较,然后请求一个锁,而在此期间,另一个线程已经在你不知道的情况下修改了bestSimilarity,使得比较无效。
如果你想避免锁定直到最后一分钟,你可以做两次比较。也就是说,比较,获取锁,再次比较,只有当它仍然有效时,才增加值。不过,对于要比较的值,要小心使用本地缓存。如果你想这样做,你需要有某种类型的同步,比如MemoryBarrier。这一切都可能变得相当复杂,所以我建议您锁定整个系统,除非您注意到性能确实是一个瓶颈
发布于 2011-10-20 12:00:38
由于bestSimilarity
是共享的,因此需要使用第一个代码段
发布于 2011-10-20 12:00:59
第二个不是线程安全的,在执行了if测试之后,另一个线程可能会更改_similarity
。
https://stackoverflow.com/questions/7835598
复制相似问题