使用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() {
...
}
答案 0 :(得分:3)
由于各种可能的原因,它不是线程安全的,但是您可能会遇到的一个问题是,编译器可以很好地优化foo
的读取到单个读取中的提升。循环所以永远不会看到变化。
答案 1 :(得分:0)
如果您使用R / W值,您应该同步写入和读取,这是因为这会导致读取不一致,比如在开始时您想要读取foo = 0
,但写入速度更快,因此您将阅读{ {1}}。
在你的上下文中,那时的迭代次数少于10次,所以它是 NOT THREAD-SAFE 。