首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >哪里是使用锁的正确位置?

哪里是使用锁的正确位置?
EN

Stack Overflow用户
提问于 2011-10-20 11:58:23
回答 5查看 153关注 0票数 3

我试图在多线程环境中找到最好的相似性。

有没有更好的选择,或者两个版本在下面是一样的?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // float bestSimilarity is shared
 // float _similarity is local

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

vs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if (_similarity > bestSimilarity)
     lock(locker) 
         bestSimilarity = _similarity;
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-20 12:00:06

你的第一个案例将保证有效。然而,第二个案例可能会失败。你比较,然后请求一个锁,而在此期间,另一个线程已经在你不知道的情况下修改了bestSimilarity,使得比较无效。

如果你想避免锁定直到最后一分钟,你可以做两次比较。也就是说,比较,获取锁,再次比较,只有当它仍然有效时,才增加值。不过,对于要比较的值,要小心使用本地缓存。如果你想这样做,你需要有某种类型的同步,比如MemoryBarrier。这一切都可能变得相当复杂,所以我建议您锁定整个系统,除非您注意到性能确实是一个瓶颈

票数 7
EN

Stack Overflow用户

发布于 2011-10-20 12:00:38

由于bestSimilarity是共享的,因此需要使用第一个代码段

票数 2
EN

Stack Overflow用户

发布于 2011-10-20 12:00:59

第二个不是线程安全的,在执行了if测试之后,另一个线程可能会更改_similarity

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7835598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文