RosettaCodeData/Task/Atomic-updates/C/atomic-updates-2.c

52 lines
872 B
C

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define irand(n) (n * (double)rand()/(RAND_MAX + 1.0))
int bucket[10];
int main()
{
int i;
for (i = 0; i < 10; i++) bucket[i] = 1000;
omp_set_num_threads(3);
#pragma omp parallel private(i)
for (i = 0; i < 10000; i++) {
int from, to, mode, diff = 0, sum;
from = irand(10);
do { to = irand(10); } while (from == to);
mode = irand(10);
switch (mode) {
case 0:
case 1:
case 2: /* equalize */
diff = (bucket[from] - bucket[to]) / 2;
break;
case 3: /* report */
sum = 0;
for (int j = 0; j < 10; j++) {
printf("%d ", bucket[j]);
sum += bucket[j];
}
printf(" Sum: %d\n", sum);
continue;
default: /* random transfer */
diff = irand(bucket[from]);
break;
}
#pragma omp critical
{
bucket[from] -= diff;
bucket[to] += diff;
}
}
return 0;
}