使用全局变量在Dart中的函数之间共享对象是否安全?

时间:2013-06-23 15:20:31

标签: global-variables dart dart-isolates

我看到“Dart是一种单线程编程语言”,所以我认为使用全局变量在函数之间传递数据是安全的:

var g = 1;

main() {
   hello();
   world();
}

def hello() {
    g = 2;
}

def world() {
    print(g);
}

我也看到“Dart提供隔离”,可以在多核上运行。这意味着如果不同的菌株访问同一个全局变量可能会很危险,对吗?

安全吗?如果没有,有没有办法在函数之间共享对象而不将它们作为参数传递?


更新

根据“Florian Loitsch”的回答,我刚刚用隔离物编写了全局变量测试:

import 'dart:isolate';

var g = 1;

echo() {
  port.receive((msg, reply) {
    reply.send('I received: $g');
  });
}

main() {
  var sendPort = spawnFunction(echo);

  void test() {
    g = 2;
    sendPort.call('Hello from main').then((reply) {
      print("I'm $g");
      print(reply);
      test();
    });
  }
  test();
}

您可以看到一个隔离专区将全局变量g设置为新值,另一个隔离专区将打印g的值。

它打印的控制台:

I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1
I'm 2
I received: 1

很明显,它们不共享内存,全局变量是安全的。

1 个答案:

答案 0 :(得分:4)

Dart在一个线程中是单线程的。因此,在全局变量中传递数据是安全的(尽管风格不好)。

分离株具有独立的堆(记忆)并且不会相互干扰。全局变量保持安全。

我认为除了静态变量和参数之外,还有一种方法可以在函数之间传递变量。