我制作了一个具有以下功能的程序:
这适用于ClassA类
变量:
int8_t* p1; // this is only modified on thread1
volatile int8_t* p2;
thread1(被锁定)
while(p1 + 64 > p2);
thread2(修改p2)
while(true) {
//reading file
p2 += 10;
//reading file
p2 += 10;
//reading file
p2 += 10;
}
Thread1在某个时刻被锁定。但是,将thread1更改为下面的代码会使thread1永远不会被锁定。
while(p1 + 64 > p2) {
printf("%d\n", p1);
}
我用-Ofast
编译了这段代码。我想问题是优化。如何在不修改编译器标志的情况下修复此问题?
答案 0 :(得分:3)
使用互斥锁或对p1
和p2
使用适当的原子类型。在C ++中,volatile
没有定义的多线程语义。修改常规变量(如p2
)而另一个线程可能正在访问它会产生不可预测的结果。不要这样做。
答案 1 :(得分:-1)
p2是在你第一个线程之外修改的变量,因此应该声明为volatile。
即使如此,也可以使用原子或互斥。 volatile不会再次保护无序的读写操作。在Linux上,当没有争用时,互斥锁非常便宜。