...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdatomic.h> /* * Sets index to point to index of maximum element in array * and value to contain maximum array value. */ void find_max_element(atomic_int array[], size_t *index, int *value); void func(void) { static size_t index; static int value; static atomic_int array[]; size_t index; int value; void func(void) { find_max_element(array, &index, &value); /* ... */ if (!atomic_compare_exchange_strong(array[index], value, 0)) { /* Handle error */ } } |
...
indexmay have changed.valuemay have changed (that is, the value of thevaluevariable).valuemay no longer be the maximum value in the array.
Compliant Solution (Mutex)
This compliant solution uses a mutex to prevent the data from being modified during the operation. Although this code is thread-safe, it is no longer lock-free.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdatomic.h> #include <threads.h> void func(void) { static atomic_int array[]; static size_t index; static int value; static mtx_t array_mutex; void func(void) { if (thrd_success != mtx_lock(&array_mutex)) { /* Handle error */ } find_max_element(array, &index, &value); /* ... */ if (!atomic_compare_exchange_strong(array[index], value, 0)) { /* Handle error */ } if (thrd_success != mtx_unlock(&array_mutex)) { /* Handle error */ } } |
...