假设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);
}
答案 0 :(得分:0)
是的,将互斥锁设置为零与更改互斥锁一样有必要。将其设置为零仍然会导致foo++
出现争用情况,并导致foo
具有错误的值。是的,多个线程访问的任何变量都需要使用这种锁定机制。在某些情况下,您可以使用原子变量为简单的增量/赋值为您处理锁定,但我从未使用过它们。
答案 1 :(得分:0)
是的,这是必要的。
唯一的例外是变量_Atomic
,因此保证一次写入即可更新。否则,理论上可能会发生奇怪的错误,例如只有二进制值的一半设置为零。
根据应用程序的性质,如果另一个线程将数据写入变量,而您立即用0
覆盖该数据,那么这当然也可能是一个错误。
答案 2 :(得分:0)
是的,任何写入或读取共享变量的操作都必须自动执行。这是一篇说明所有问题的文章:What_is_an_atomic_operation。 Mutex Lock Code Examples也可能会有所帮助。