我尝试在多线程环境中找到最佳相似性。

有没有更好的选择或者下面的两个版本相同?

 // float bestSimilarity is shared
 // float _similarity is local

 lock(locker)
     if (_similarity > bestSimilarity)
         bestSimilarity = _similarity;


 if (_similarity > bestSimilarity)
     lock(locker)
         bestSimilarity = _similarity;

最佳答案

您的第一种情况将得到保证。但是,第二种情况可能会崩溃。您进行比较,然后请求锁定,与此同时,另一个线程已经修改了bestSimilarity,而您不知道它使比较无效。

如果您想避免锁定直到最后一刻,则可以进行两次比较。也就是说,比较,获取锁,再次比较,并且仅在其仍然有效时才增加该值。不过,请谨慎使用要比较的值的本地缓存。如果要执行此操作,则需要在那里进行某种同步,例如MemoryBarrier。这一切都可能变得非常复杂,因此我建议只锁定整个事情,除非您注意到性能确实是瓶颈

09-06 19:44