私は最近、コンパイラが命令を再配置することでコードを最適化し、これはバリアを使用して制御できることを知りました。
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() を呼び出していることを認識しないようです。
これはバグにつながりますか?何らかの方法でバリアを手動で指定する必要がありますか?