スレッドセーフの概念を理解しています。単一の変数を保護しようとするときにスレッドセーフを簡素化するためのアドバイスを探しています。
変数があるとしましょう:
double aPass;
この変数を保護したいので、ミューテックスを作成します。
pthread_mutex_t aPass_lock;
今、私がこれを行うことを考えることができる2つの良い方法がありますが、どちらも厄介な欠点があります。1つ目は、変数を保持するスレッドセーフクラスを作成することです。
class aPass {
public:
aPass() {
pthread_mutex_init(&aPass_lock, NULL);
aPass_ = 0;
}
void get(double & setMe) {
pthread_mutex_lock(aPass_lock);
setMe = aPass_
pthread_mutex_unlock(aPass_lock);
}
void set(const double setThis) {
pthread_mutex_lock(aPass_lock);
aPass_ = setThis;
pthread_mutex_unlock(aPass_lock);
}
private:
double aPass_;
pthread_mutex_t aPass_lock;
};
今、これはaPass
完全に安全に保たれます、何も間違えられることはなく、それに触れることはありません、イェーイ!しかし、そのすべての混乱を見て、それにアクセスするときの混乱を想像してください。キモい。
もう1つの方法は、両方にアクセスできるようにすることと、aPassを使用する前にミューテックスをロックすることを確認することです。
pthread_mutex_lock(aPass_lock);
do something with aPass
pthread_mutex_unlock(aPass_lock);
しかし、新しい誰かがプロジェクトに参加した場合、一度ロックするのを忘れた場合はどうなりますか。難しいスレッドの問題をデバッグするのは好きではありません。
(ブーストサポートがほとんどないQNXを使用する必要があるため、pthreadを使用する)大きなクラスを必要とせずに単一の変数をロックするための良い方法はありますか?それは、それに合わせてミューテックスロックを作成するよりも安全ですか?