-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsimple_critical.cpp
More file actions
47 lines (38 loc) · 1.34 KB
/
Copy pathsimple_critical.cpp
File metadata and controls
47 lines (38 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
#include <omp.h>
int main(int argc, char* argv[])
{
const int expected = 1;
bool failed = false;
// Variable only modified in critical section
int criticalVar = expected;
int randomValue = 2;
#pragma omp parallel for num_threads(4) default(none) \
shared(randomValue, criticalVar, expected, failed)
for (int i = 0; i < 1000; i++) {
#pragma omp critical
{
if (criticalVar != expected) {
printf("Thread %d critical unexpected %d != %d\n",
omp_get_thread_num(),
criticalVar,
expected);
failed = true;
}
// Do a load of modifications to the critical variable that will be
// picked up by other threads if the critical isn't working.
criticalVar = 2;
for (int j = 0; j < 10000; j++) {
criticalVar = (criticalVar + randomValue) % 4 + 10;
}
randomValue = ((omp_get_thread_num() + 1) * randomValue) % 7;
// Set back to original value
criticalVar = expected;
}
}
if (failed || criticalVar != expected) {
printf("Critical section error, assumption failed: %d\n", criticalVar);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}