【问题标题】:Is there a danger to access global variable or static function from multiple threads?从多个线程访问全局变量或静态函数是否存在危险?
【发布时间】:2017-03-21 20:00:00
【问题描述】:

假设我有一个具有全局变量、方法和几个线程的类。

    class Class
    {
      public var Var1;

      piblic mainFoo()
      {
          thread1.start(thread_foo1);
          thread2.start(thread_foo2);
      }
      public void Foo(var1, var2, var3)
      {
       ...
      }

      private thread_foo1()
      {

        if(Var1) {}
        Foo(_var1,_var2,_var3);

      }

      private thread_foo2()
      {

        if(Var1) {}
        Foo(_var1,_var2,_var3);

      }

    }

Var1 除了主线程外没有任何变化。 Foo 不会更改任何线程中的任何数据,它只是一些我不想重复的小通用代码。这种结构是否会导致线程中的任何问题或冲突?

【问题讨论】:

  • 除了最初的变量之外,你的主线程是否更新了变量?
  • 不,只要两个线程可以同时在Foo中运行就可以了……但情况并非总是如此。
  • @WillemVanOnsem 被撕毁了怎么办?
  • @johnny5:只有当某个线程写入到您读取的对象时,才会发生撕裂的读取。在问题中,据说没有线程 write.
  • OP: Var1 is not changed anywhere but the main thread 这意味着主线程可以更改变量,在示例 var Var1 中正确声明 Var1 如果它是布尔值,一切都应该(假设是)没问题

标签: c#


【解决方案1】:

这取决于全局变量的类型。

1) 全局变量是值类型

2) 全局变量是引用类型

  • 引用分配保证是原子的,因此可以从任何线程安全地完成分配
  • 如果类型是不可变或无状态的,您可以假设从其他线程读取是安全的(例如 string)
  • 如果类型保证是线程安全的,您可以假设从其他线程读取是安全的(例如ConcurentDictionary)
  • 否则读取(或更准确地说是通过变量的属性访问内部状态)是不安全的,因为变量属性上的任何逻辑都可能导致在从其他线程读取时内部状态不一致(例如 Dictionary)

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多