Защита глобальной переменной с помощью мьютекса - PullRequest
0 голосов
/ 03 декабря 2018

предполагая, что функция потока выполняется одновременно потоками nbThreads, необходимо защитить переменную foo, чтобы установить ее в 0?В более общем случае, необходимо ли защищать глобальную переменную общего доступа, если мы просто установим ее в 0?

#include <pthread.h>
int foo = 0;
int nbThreads = 10;
pthread_mutex_t mut;

void thread(void *arg) {
    if (foo == nbThreads - 1) {
        foo = 0;
    } else {
        pthread_mutex_lock(&mut);
        foo++;
        pthread_mutex_unlock(&mut);
    }
    pthread_exit(NULL);
}

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Да, это необходимо.

Единственным исключением является переменная, которая _Atomic и поэтому гарантированно будет обновлена ​​за одну запись.В противном случае теоретически могут возникнуть странные ошибки, например, установить только половину двоичного значения на ноль.

В зависимости от характера приложения, это также может быть ошибкой, если другой поток записывает данные впеременная, и вы сразу же перезапишите эти данные с помощью 0.

0 голосов
/ 03 декабря 2018

Да, любая операция записи или чтения общей переменной должна выполняться атомарно.Вот статья, которая объясняет все об этом: What_is_an_atomic_operation .Это также может быть полезно Примеры кодов блокировки Mutex .

0 голосов
/ 03 декабря 2018

Да, использовать мьютекс так же необходимо при установке его на ноль, как и при его изменении.Установка его в ноль может по-прежнему иметь условия гонки с foo++ и в результате foo будет иметь неправильное значение.Да, любая переменная, доступ к которой осуществляется несколькими потоками, должна использовать этот тип механизма блокировки.В некоторых случаях вы можете использовать атомарную переменную, которая обрабатывает блокировку для простых приращений / назначений, но я никогда не использовал их.

...