当前位置: 首页 > 面试题库 >

分叉后,是否共享全局变量?

督瑞
2023-03-14
问题内容

考虑以下简单代码:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

当child增加myvar时,该值是否与父亲共享(如pthread)?


问题答案:

不,是的。

不,它们不会以程序员可见的任何方式共享;进程可以独立地修改自己的变量副本,并且它们将在不影响其他进程(例如fork()父,兄弟姐妹或后代)的情况下进行更改。

但是,是的,OS实际上最初确实共享页面,因为fork实现了写时复制功能,这意味着只要没有任何进程修改页面,就可以共享页面。但是,这是可以忽略的优化。

如果您要使用共享变量,请将它们放在匿名共享映射中(请参阅mmap()),在这种情况下,它们确实会被共享,并附带所有警告。



 类似资料:
  • 问题内容: 我想使用ctypes在库中映射一个声明为全局值的int值。 目前,我可以像这样加载库: 并成功映射了许多功能。但是,出于错误检查的目的,其中许多设置了变量,因此我也需要访问该变量。但是,如果我尝试访问它,则会得到: 当然,它不是函数指针,尝试调用它会导致段错误。 在主头文件和API头文件中声明为。 Objdump将符号显示为: 问题答案: ctypes文档中有一节关于访问dll中导出的

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

  • 本文向大家介绍MySQL全局共享内存介绍,包括了MySQL全局共享内存介绍的使用技巧和注意事项,需要的朋友参考一下 前言 全局共享内存则主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的 Query Cache,缓存连接线程的 Thread Cache,缓存表文件句柄信息的 Table Cache,缓存二进制日志的 Bi

  • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两

  • 一般情况下,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量被复制到每台机器上,并且这些变量在远程机器上 的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变量(broadcast variable)和累加器(acc

  • Shared variables (共享变量)是为所有模板定义的变量。可以使用 setSharedVariable 方法向配置中添加共享变量: Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); ... cfg.setSharedVariable("warp", new WarpDirective()); cfg