Kev*_*ith 5 c# static multithreading
假设我有一个带静态方法的静态类.
多个线程可以同时调用此静态方法.
在这些情况下是否存在竞争条件:
Run Code Online (Sandbox Code Playgroud)a - if the method depends only on local variables b - if the method depends on local variables and member fields
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() 
  { }
}
它没有字段,两个绝对没有的方法,以及只能在一个线程上访问的单个局部变量.尽管如此,它立即陷入僵局.(您明白为什么?有关此计划的更多信息,请参阅http://ericlippert.com/2013/01/31/the-no-lock-deadlock/.)
如果您的静态方法不访问字段,听起来您正在寻找保证您的程序是线程安全的.没有这样的保证.当且仅当您将程序写为线程安全时,您的程序才是线程安全的.
首先,方法只是驻留在地址的一段代码.调用方法的每个线程都将拥有该方法的副本及其本地变量在其自己的私有堆栈上.所以如果a,如果没有其他捕获,它应该是线程安全的.
案例b取决于很多因素:
但一般来说,假设您访问类成员,则不应将其视为线程安全的.
| 归档时间: | 
 | 
| 查看次数: | 3354 次 | 
| 最近记录: |