不共享相同数据的并行进程
Parallel processes not sharing same data
我正在编写一些 C 代码,其中存在一个作为 int 指针的变量。进程应该做的是减去该变量的值,直到它达到 0。
问题是即使程序打印的地址相同,每个进程似乎都有自己的变量副本。发生这种情况是因为每个进程在内存中都有自己的 space 吗?
这是输出:
START
Account address: 0x7ffee5820be0
Parent substracted 10. Account value: 90, address 0x7ffee5820be0
Parent substracted 10. Account value: 80, address 0x7ffee5820be0
Parent substracted 10. Account value: 70, address 0x7ffee5820be0
Parent substracted 10. Account value: 60, address 0x7ffee5820be0
Parent substracted 10. Account value: 50, address 0x7ffee5820be0
Parent substracted 10. Account value: 40, address 0x7ffee5820be0
Parent substracted 10. Account value: 30, address 0x7ffee5820be0
Parent substracted 10. Account value: 20, address 0x7ffee5820be0
Parent substracted 10. Account value: 10, address 0x7ffee5820be0
Parent substracted 10. Account value: 0, address 0x7ffee5820be0
Child substracted 10. Account value: 90 , address 0x7ffee5820be0
Child substracted 10. Account value: 80 , address 0x7ffee5820be0
Child substracted 10. Account value: 70 , address 0x7ffee5820be0
Child substracted 10. Account value: 60 , address 0x7ffee5820be0
Child substracted 10. Account value: 50 , address 0x7ffee5820be0
Child substracted 10. Account value: 40 , address 0x7ffee5820be0
Child substracted 10. Account value: 30 , address 0x7ffee5820be0
Child substracted 10. Account value: 20 , address 0x7ffee5820be0
Child substracted 10. Account value: 10 , address 0x7ffee5820be0
Child substracted 10. Account value: 0 , address 0x7ffee5820be0
看看这个 post,我认为它会解释为什么地址对于父子来说似乎是相同的,以及整个内存状态不在父子之间共享的事实:
fork() system call and memory space of the process
是的,你的假设是正确的。
如果您想共享内存 space,您有两个选择:
- 查看共享内存 - "POSIX Shared Memory" 或 "System V Shared Memory",或
- 使用线程 - C11/C++11 线程或 "pthreads"(即 POSIX 线程) - 自动共享相同的内存 space,或
- 使用 Redis,这是一个非常快速的内存数据结构服务器(队列、列表、集合、散列,strings/ints/floats),然后您可以共享世界各地进程之间的变量(实际上是原子的)。
我正在编写一些 C 代码,其中存在一个作为 int 指针的变量。进程应该做的是减去该变量的值,直到它达到 0。 问题是即使程序打印的地址相同,每个进程似乎都有自己的变量副本。发生这种情况是因为每个进程在内存中都有自己的 space 吗?
这是输出:
START
Account address: 0x7ffee5820be0
Parent substracted 10. Account value: 90, address 0x7ffee5820be0
Parent substracted 10. Account value: 80, address 0x7ffee5820be0
Parent substracted 10. Account value: 70, address 0x7ffee5820be0
Parent substracted 10. Account value: 60, address 0x7ffee5820be0
Parent substracted 10. Account value: 50, address 0x7ffee5820be0
Parent substracted 10. Account value: 40, address 0x7ffee5820be0
Parent substracted 10. Account value: 30, address 0x7ffee5820be0
Parent substracted 10. Account value: 20, address 0x7ffee5820be0
Parent substracted 10. Account value: 10, address 0x7ffee5820be0
Parent substracted 10. Account value: 0, address 0x7ffee5820be0
Child substracted 10. Account value: 90 , address 0x7ffee5820be0
Child substracted 10. Account value: 80 , address 0x7ffee5820be0
Child substracted 10. Account value: 70 , address 0x7ffee5820be0
Child substracted 10. Account value: 60 , address 0x7ffee5820be0
Child substracted 10. Account value: 50 , address 0x7ffee5820be0
Child substracted 10. Account value: 40 , address 0x7ffee5820be0
Child substracted 10. Account value: 30 , address 0x7ffee5820be0
Child substracted 10. Account value: 20 , address 0x7ffee5820be0
Child substracted 10. Account value: 10 , address 0x7ffee5820be0
Child substracted 10. Account value: 0 , address 0x7ffee5820be0
看看这个 post,我认为它会解释为什么地址对于父子来说似乎是相同的,以及整个内存状态不在父子之间共享的事实:
fork() system call and memory space of the process
是的,你的假设是正确的。
如果您想共享内存 space,您有两个选择:
- 查看共享内存 - "POSIX Shared Memory" 或 "System V Shared Memory",或
- 使用线程 - C11/C++11 线程或 "pthreads"(即 POSIX 线程) - 自动共享相同的内存 space,或
- 使用 Redis,这是一个非常快速的内存数据结构服务器(队列、列表、集合、散列,strings/ints/floats),然后您可以共享世界各地进程之间的变量(实际上是原子的)。