线程安全方法,不使用任何类型的锁

时间:2012-02-20 10:14:33

标签: c#

我们如何在不使用任何类型的锁的情况下创建线程安全的方法?任何帮助都将高度重视。感谢

5 个答案:

答案 0 :(得分:2)

这取决于您在方法中需要做什么,但通常可以使用名为CompareAndSwap的技术。 .NET框架使用CompareExchange函数。在任何情况下,您都必须检查是否能以适合CAS的方式表达锁定。

答案 1 :(得分:2)

如果您想避免锁定,您还希望避免共享(可变)状态。函数式编程是一种不具有任何可变状态的范例。您可以在许多编程语言和环境中进行函数式编程,但举一个例子,像Erlang这样的语言特别适合解决这些问题。

答案 2 :(得分:1)

这是一个非常高级的问题,所以这里是一个高级答案:

http://en.wikipedia.org/wiki/Reentrancy_(computing)

答案 3 :(得分:1)

不要修改任何共享状态。即对于任何一块内存,最多只有一个线程可以写入它。如果您想避免所有锁定,这是您唯一的选择。

即使是“无锁”编程技术(Interlocked类)也会使用某种锁,即使它比普通锁更便宜。

答案 4 :(得分:1)

  

我们如何在不使用任何类型的锁的情况下创建线程安全方法?

要么:不要mdify任何共享状态。基本上这意味着要么(a)你可以使方法静态而不破坏它(因为它不使用任何实例ariables)或(b)所有这些变量是只读和READONLY(所以另一个thead不能改变它们)或者你可以应对变化。

替代:

或者:你醒来后意识到有趣的洗漱可能无法实现。当下yuo修改股票状态,你就是“一种锁定”。有锁定免费机制,但它们在严格的术语(“无锁定”)中是“无锁”,而不是在你的术语中(即他们使用一种锁定)。技术上,自旋锁是无锁的 - 自旋锁是一种锁,但不是真正的锁。