gpt4 book ai didi

原子内置函数可以跨多个进程使用吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:54 25 4
gpt4 key购买 nike

我正从 .NET 回到 C,所以请原谅我的代码,但我正在尝试在现有的多进程程序中实现原子内置增量器。

我编写了一个测试程序,但无法运行。它正确地递增到 5,但每个 child 都将该值递增到 6,而不是将它一起递增到 10。监视器显示 5。

我尝试过使用全局 int 进行各种更改,而不是将 static int 从 main 传递给 child,但结果相同。感谢您提供任何帮助,谢谢。

  1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include "list.h"
7
8 #define N 5
9 static int globalcount = 0;
10
11 void Monitor()
12 {
13 sleep(1);
14 printf("Monitor Value %d\n", globalcount);
15 }
16
17 void Child()
18 {
19 int value = __sync_add_and_fetch(&globalcount, 1);
20 printf("Child Value %d\n", value);
21 }
22
23 int main(int argc, char** argv)
24 {
25 int i;
26 int value;
27 static int count = 0;
28 pid_t pid[N];
29 pid_t pidkey;
30
31 for (i = 0; i < N; ++i) {
32 value = __sync_add_and_fetch(&globalcount, 1);
33 printf("Value %d\n", value);
34 }
35 printf("\n\n\n");
36
37 if ((pidkey = fork()) == 0) {
38 Monitor();
39 } else if (pidkey > 0) {
40 for (i = 0; i < N; i++)
41 {
42 if ((pid[i] = fork()) == 0) {
43 Child();
44 break;
45 }
46 }
47 }
48 return 0;
49 }

最佳答案

如果没记错的话,当你fork()你的进程时,子进程会得到一个变量的副本,或者更确切地说,变量是写时复制的。也就是说,在您尝试更改它之前,您基本上会引用相同的数据。您要完成的工作需要的不仅仅是在代码顶部声明的 static 变量。您需要考虑使用共享内存,以便可以跨进程空间共享变量。因为这需要很长时间才能理解,而且真的不是 5 行答案,所以我将不得不稍后回来编辑更详细的内容。但是,如果您在手册页中查找 shm_get 函数(以及与之相关的各种其他 shm_* 函数),文档会非常丰富。网络上还有许多教程:搜索“POSIX IPC 共享内存教程示例”,您应该会找到各种说明如何操作的点击率。

关于原子内置函数可以跨多个进程使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com