当前位置: 首页 > 知识库问答 >
问题:

在Dart中使用全局变量在函数间共享对象安全吗?

夏侯自珍
2023-03-14

我看到“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个答案

子车俊材
2023-03-14

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

隔离有各自独立的堆(内存),并且不会相互干扰。全局变量保持安全。

我认为除了静态变量和参数之外,没有办法在函数之间传递变量。

 类似资料:
  • 问题内容: 在我的应用中,公共对象的状态通过发出请求来更改,而响应取决于状态。 如果我在开发服务器上运行此程序,则期望得到1、2、3等。如果同时从100个不同的客户发出请求,会出问题吗?预期结果将是100个不同的客户端各自看到一个从1到100的唯一数字。或者会发生以下情况: 客户端1查询。增加1。 在执行return语句之前,线程将切换到客户端2。再次递增。 线程切换回客户端1,并向客户端返回数字

  • 我尝试创建一个Dart单页应用程序。 我已经创建了第一个自定义元素(),它包含整个应用程序。它有一个容器,用于呈现视图。和一个侧导航,它将包含用户信息,并在用户登录时更新。 我想在视图之间共享信息。如何在

  • 问题内容: 如何在函数中创建或使用全局变量? 如果在一个函数中创建全局变量,如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要对其进行访问的函数的局部变量中? 问题答案: 你可以在其他函数中使用全局变量,方法是像在分配给它的每个函数中一样声明它: 我想这是因为全局变量是如此危险,因此Python希望通过显式要求使用关键字来确保您真正知道这就是要使用的内容。

  • 问题内容: 在我的应用中,公共对象的状态通过发出请求来更改,而响应取决于状态。 如果我在开发服务器上运行此程序,则期望得到1、2、3等。如果同时从100个不同的客户发出请求,会出问题吗?预期结果将是100个不同的客户端各自看到一个从1到100的唯一数字。或者会发生以下情况: 客户端1查询。增加1。 在执行return语句之前,线程将切换到客户端2。再次递增。 线程切换回客户端1,并向客户端返回数字

  • 问题内容: 我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。 问题的阐述: 说是有一个静态/全局变量在。exe 和dll 都具有,因此变量都在两个图像中。 现在,动态加载(或静态)。然后,问题是该变量是否由exe和dll共享。 在Windows中,这两个家伙 永远不会 共享:exe和dll将具有的单独副本。但是,在Li

  • 问题内容: 如何在python函数中设置全局变量? 问题答案: 要在函数内部使用变量,您需要像这样在函数内部进行操作。 给出输出 请记住,如果您要进行分配/更改它们,则只需要在函数内声明它们。打印和访问不需要。 你可以做, 而不像我们在第一个函数中那样声明它,它仍然可以正确赋值。 以a为例,您不能在不声明的情况下分配a ,但是可以调用它的方法并更改列表。如下所示。