【问题标题】:Question regarding behavior of static variables within multiple instances of single executable [closed]关于单个可执行文件的多个实例中静态变量行为的问题[关闭]
【发布时间】:2020-01-21 10:31:43
【问题描述】:

当一个应用程序并行执行多次时,该程序中静态声明的变量是分配在单个线程上还是在多个线程之间复制?

【问题讨论】:

  • "同一程序正在并行执行" - 一个 exe 实例具有多个线程?还是多个 exe 实例,每个实例都有一个主线程(涉及这些变量)?很重要
  • 静态变量共享,unless
  • @GSerg 在同一个 exe 中
  • 嗨 - 我希望以一种可以更清楚地改进您的问题并得出有用答案的方式重新表述您的问题。我希望我的编辑反映了对您问题的正确解释,并且您获得了所需的帮助。祝你有美好的一天!

标签: c#


【解决方案1】:

我遇到了一个并行执行相同程序的情况,

如果您的意思是您有多个正在执行的程序的实例(即不同的进程;即您多次启动foo.exe),那么它们是完全独立的。

如果你的意思是你有一个程序实例,它通过任何机制在内部使用并行线程:那么它们是完全共享的……通常。

static 字段的正常范围是:应用程序域。几乎总是,这意味着:过程。

如果您的 static 字段是不可变的(包括它们的任何子内容),那么:这真的没多大关系;为了提高效率,他们不妨共享那个只读的不可变状态。但是,如果您改变这些值(包括改变任何子内容),那么它就会真的变得一团糟。坦率地说,如果静态字段以任何方式(除了初始设置)发生了重大变异,它可能不应该是静态字段。

但是!还有[ThreadStatic]。如果static 字段被标记为[ThreadStatic],则范围是每个线程。这……不是建议。特别是,它根本不适用于async / await,因为您无法真正控制继续执行哪个线程 - 这意味着您可能会无意中在逻辑状态之间切换,没有意识到。坦率地说,在这种情况下,我的建议是创建一个 object 来表示每个线程或每个工作项的状态,并让每个线程使用它(也许工作方法可以是一个实例同一状态对象上的方法)。这很容易理解,并且使调试和重构变得更加简单。

【讨论】:

    【解决方案2】:

    操作系统以分离的内存运行进程。因此,如果您使用分离的进程,那么您将拥有不同的静态变量。在同一进程中,静态变量为所有线程分配一次。

    了解 IPC:https://en.wikipedia.org/wiki/Inter-process_communication

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2021-11-29
      • 2013-06-02
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多