mfe*_*old 3 .net multithreading
这个问题一直困扰着我:在多线程/多处理器环境中 - 是否有必要使用显式锁来同步对共享变量的访问?
这是一个场景:我有一个指向共享对象的全局变量.创建对象的实例时,对它的引用将放在变量中,并且可供其他线程/处理器访问.
对象本身是不可变的 - 一旦创建它永远不会改变,因为多个线程可以访问它而无需任何额外的同步.
偶尔我需要更新对象.我这样做是在侧面创建一个新的对象实例,然后在全局变量中放置对新对象的引用.
所以这里有一个问题:我可以考虑将引用替换为原子操作.换句话说,变量总是对我的对象有一个有效的引用 - 旧的还是新的?
Eri*_*ert 11
是否有必要使用显式锁来同步对共享变量的访问?
必要?不是.一个好主意?是.低锁技术非常难以正确,很少有理由.请记住,有争议时锁定很慢; 如果您的锁被争议,请修复导致它们被争议的问题,而不是转向低锁解决方案.
对象本身是不可变的 - 一旦创建它永远不会改变,因为多个线程可以访问它而无需任何额外的同步.
真棒.
偶尔我需要更新对象.我这样做是在侧面创建一个新的对象实例,然后在全局变量中放置对新对象的引用.
所以这里有一个问题:我可以考虑将引用替换为原子操作.换句话说,变量总是对我的对象有一个有效的引用 - 旧的还是新的?
是.C#规范保证对引用的操作是原子的.然而,原子性只是线程安全的一小部分.原子性只保证每次查看变量时,都会得到一个有效的引用.它不能保证每次查看变量时都会得到当前的引用.它也不保证任何两个线程以相同的顺序看到相同的更改序列. 它也不保证按照它们在每个线程上发生的顺序看到对两个不同变量的两个原子更新.Atomicity几乎保证你什么都没有,它可能无法保证你的程序按照你认为应该的方式运行.
我的建议:如果您可以避免在多个线程上访问此变量,请执行此操作.如果你无法避免它,请在它周围放锁.只有当你发现由于性能原因锁定太慢而且如果考虑采用危险的低锁技术(如使变量变为易失性,使用互锁交换等),则无法消除足够的争用.
| 归档时间: |
|
| 查看次数: |
1747 次 |
| 最近记录: |