c# – 线程无锁定通信
如果我可以保证自己整个应用程序中只有一种方法可以写入某个变量,那么我可以允许我的应用程序中的其他方法安全地读取该值吗?
如果是这样,我可以在不锁定变量的情况下逃脱这个特技吗? 在这种情况下,我正在做(或者,尝试做或想要做)是一个线程中的一个方法将值放入变量,然后其他线程中的其他方法将读取该值并做出决策. 一个非常好的选择是锁定写入,同时允许读取. 看到这里MSDN page on lock并没有看到这样做的方法. 解决方法
一如既往,它在很大程度上取决于背景.
>在紧密循环中读取的变量可以存储在寄存器或本地缓存中,因此除非您有“栅栏”,否则不会发现任何变化. volatile会解决这个问题,但是作为副作用而不是明确的意图;大多数人(包括我)无法正确定义易失性的含义 – 因此要非常小心地将其用作“修复”. 但是,您可能会发现Interlocked可以在不需要锁定的情况下解决您的大部分问题.与此同时,无争议的锁定速度非常快,甚至有争议的锁定速度仍然非常快.坦率地说,我不确定你给它的想法是否值得:平锁几乎肯定足够快,只要你先在锁外做思考,只有当你知道改变时才锁定它想做. 还有ReaderWriterLockSlim,但实际上提高性能的案例数量很少 – 根据我的经验,最简单的方法通常是最快的,即锁定或互锁. ReaderWriterLockSlim是一个更复杂的野兽,专为更复杂的场景而设计,因此具有一点开销.数量不大,但足以让它值得仔细观察. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |