クラスが 1 つだけの非常に単純な共有データ構造があります。これは、更新を行う前に、すべてのスレッドが最初にミューテックスを取得するという考え方です。
class SharedData {
private:
int * score;
int n_loc;
public:
mutex mutex;
SharedData(int n_loc) : n_loc(n_loc) {
score = new int[n_loc];
}
~SharedData() {
delete [] score;
}
void update_score(int * score2) {
for(uint i = 0; i < n_loc; ++i) {
score[i] = score2[i] = max(score[i], score2[i]);
}
}
};
たとえば、クラスが独自のミューテックスを処理しても問題ありませんか
void update_score_safe(int * score2, bool force_update = false) {
if(force_update) mutex.lock();
else if(!mutex.try_lock()) return;
update_score(score2);
mutex.unlock();
}
このコードはスレッドセーフになりましたか? コードがロックせずにクラスを呼び出すのを防ぐことはできますか (ミューテックスと実際の更新メソッドをプライベートにすることを考えると)?