我尝试在多线程环境中找到最佳相似性。
有没有更好的选择或者下面的两个版本相同?
// float bestSimilarity is shared
// float _similarity is local
lock(locker)
if (_similarity > bestSimilarity)
bestSimilarity = _similarity;
与
if (_similarity > bestSimilarity)
lock(locker)
bestSimilarity = _similarity;
最佳答案
您的第一种情况将得到保证。但是,第二种情况可能会崩溃。您进行比较,然后请求锁定,与此同时,另一个线程已经修改了bestSimilarity,而您不知道它使比较无效。
如果您想避免锁定直到最后一刻,则可以进行两次比较。也就是说,比较,获取锁,再次比较,并且仅在其仍然有效时才增加该值。不过,请谨慎使用要比较的值的本地缓存。如果要执行此操作,则需要在那里进行某种同步,例如MemoryBarrier。这一切都可能变得非常复杂,因此我建议只锁定整个事情,除非您注意到性能确实是瓶颈