具有静态类的竞争条件?

Kev*_*ith 5 c# static multithreading

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

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

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

a - if the method depends only on local variables
b - if the method depends on local variables and member fields
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 24

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

好.

在这些情况下是否存在竞争条件的可能性: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() 
  { }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Tudor:我的观点只是为了说明在多个线程上调用的*any*方法会导致有趣的线程行为.最初的海报是询问有关当地人和田地等的问题,寻找保证他在某些情况下不必仔细考虑线程安全问题.**没有这样的情况**.你总是要努力思考它. (2认同)

Tud*_*dor 5

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

案例b取决于很多因素:

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

但一般来说,假设您访问类成员,则不应将其视为线程安全的.