我最近了解到编译器会通过重新排列指令来优化你的代码,这可以通过使用屏障来控制。
IIRC,锁定互斥锁会造成障碍,解锁互斥锁也会造成障碍,以防止关键部分内的代码流出。
所以 pthread_mutex_lock 和 pthread_mutex_unlock 必须隐含地成为这些“障碍”。如果我有这样一个包含互斥锁的类怎么办?
class IMutex {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};
在我看来,编译器不会知道我在 lock() 中调用 pthread_mutex_lock(),在 unlock() 中调用 pthread_mutex_unlock(),因为它们都是虚拟的。
这会导致错误吗?我是否需要以某种方式手动指定障碍?