用互斥保护全局变量

时间:2018-12-03 16:12:20

标签: c mutex

假设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 :(得分:0)

是的,将互斥锁设置为零与更改互斥锁一样有必要。将其设置为零仍然会导致foo++出现争用情况,并导致foo具有错误的值。是的,多个线程访问的任何变量都需要使用这种锁定机制。在某些情况下,您可以使用原子变量为简单的增量/赋值为您处理锁定,但我从未使用过它们。

答案 1 :(得分:0)

是的,这是必要的。

唯一的例外是变量_Atomic,因此保证一次写入即可更新。否则,理论上可能会发生奇怪的错误,例如只有二进制值的一半设置为零。

根据应用程序的性质,如果另一个线程将数据写入变量,而您立即用0覆盖该数据,那么这当然也可能是一个错误。

答案 2 :(得分:0)

是的,任何写入或读取共享变量的操作都必须自动执行。这是一篇说明所有问题的文章:What_is_an_atomic_operationMutex Lock Code Examples也可能会有所帮助。