Я возвращаюсь в C из .NET, поэтому, пожалуйста, прости мой код, но я пытаюсь реализовать встроенный атомарный инкремент в существующую многопроцессорную программу.
Я написал тестовую программу,и я не могу заставить его работать.Он правильно увеличивается до 5, но каждый дочерний элемент увеличивает значение до 6, а не увеличивает его до 10. Монитор отображает 5.
Я пробовал различные изменения, используя глобальный int вместо передачи статического int из mainребенку, но результат тот же.Любая помощь приветствуется, спасибо.
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 }