具有静态类的竞争条件?

时间:2012-03-20 17:44:10

标签: c# multithreading static

假设我有一个带静态方法的静态类。

多个线程可以同时调用此静态方法。

在这种情况下是否存在竞争条件:

a - if the method depends only on local variables
b - if the method depends on local variables and member fields

3 个答案:

答案 0 :(得分:22)

  

假设我有一个带静态方法的静态类。多个线程可以同时调用此静态方法。

行。

  

在这种情况下是否存在竞争条件:   a - 如果方法仅依赖于局部变量

是的,有潜在的竞争条件。

  

b - 如果方法依赖于局部变量和成员字段

是的,有潜在的竞争条件。

(a)和(b)的答案是更一般规则的结果,即始终潜在的竞争条件任何时间来自多个线程的任何方法。例如,这个程序死锁:

class MyClass
{
  static MyClass() 
  {
    // Let's run the initialization on another thread!
    var thread = new System.Threading.Thread(Initialize);
    thread.Start();
    thread.Join();
  }

  static void Initialize() 
  { }

  static void Main() 
  { }
}

它没有字段,两个绝对没有的方法,以及只能在一个线程上访问的单个局部变量。尽管如此,它立即陷入僵局。 (您知道为什么吗?有关此计划的更多信息,请参阅http://ericlippert.com/2013/01/31/the-no-lock-deadlock/。)

如果您的静态方法不访问字段,听起来您正在寻找保证您的程序是线程安全的。 没有这样的保证。你的程序是线程安全的当且仅当你把它写成线程安全时。

答案 1 :(得分:5)

首先,方法只是一段驻留在地址的代码。调用方法的每个线程都将拥有该方法的副本及其本地变量在其自己的私有堆栈上。所以如果a,如果没有其他捕获,它应该是线程安全的

案例b取决于很多因素:

  • 您实际访问这些成员变量吗?
  • 你是如何访问它们的:只读,读+写等。
  • 什么样的成员变量:数据结构,单个值。
  • 您是否有任何同步?

一般来说,假设您确实访问了类成员,它不应被视为线程安全

答案 2 :(得分:3)

A - 否。竞争条件仅在静态方法尝试访问共享资源时发生。局部变量对于调用该方法的每个线程都是唯一的。

B - 是的。这些静态成员将由调用该方法的所有线程共享。