是否可以读取线程安全但不写共享变量?

时间:2016-12-22 12:19:21

标签: c multithreading thread-safety pthreads

使用Pthreads,假设在线程1和2之间存在全局共享变量foo。在不使用互斥锁的情况下从线程1读取foo的值是否可以线程安全?请注意,虽然线程1读取foo,但线程2可能正在更改其值(但它当然会预先锁定互斥锁)。

情况是这样的:

#include <pthread.h>
...
int foo;
pthread_mutex_t mutex;
...

void *thread1(void *t) {
  while (foo<10) {
    // do stuff
  }
  pthread_exit(NULL);
}

void *thread1(void *t) {
  ...
  pthread_mutex_lock(&mutex);
  ...
  foo++;
  ...
  pthread_mutex_unlock(&mutex);
  ...
  pthread_exit(NULL);
}

int main() {
  ...
}

2 个答案:

答案 0 :(得分:3)

由于各种可能的原因,它不是线程安全的,但是您可能会遇到的一个问题是,编译器可以很好地优化foo的读取到单个读取中的提升。循环所以永远不会看到变化。

答案 1 :(得分:0)

如果您使用R / W值,您应该同步写入和读取,这是因为这会导致读取不一致,比如在开始时您想要读取foo = 0,但写入速度更快,因此您将阅读{ {1}}。

在你的上下文中,那时的迭代次数少于10次,所以它是 NOT THREAD-SAFE