导致线程锁定的C ++优化

时间:2017-02-23 08:50:36

标签: c++ multithreading compiler-optimization

我制作了一个具有以下功能的程序:

这适用于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编译了这段代码。我想问题是优化。如何在不修改编译器标志的情况下修复此问题?

2 个答案:

答案 0 :(得分:3)

使用互斥锁或对p1p2使用适当的原子类型。在C ++中,volatile没有定义的多线程语义。修改常规变量(如p2)而另一个线程可能正在访问它会产生不可预测的结果。不要这样做。

答案 1 :(得分:-1)

p2是在你第一个线程之外修改的变量,因此应该声明为volatile。

即使如此,也可以使用原子或互斥。 volatile不会再次保护无序的读写操作。在Linux上,当没有争用时,互斥锁非常便宜。