2

クラスが 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();
}

このコードはスレッドセーフになりましたか? コードがロックせずにクラスを呼び出すのを防ぐことはできますか (ミューテックスと実際の更新メソッドをプライベートにすることを考えると)?

4

2 に答える 2

4

完全ではありません。コピー可能または割り当て可能でないことを確認する必要があります。あなたの「ミューテックス」はそれを禁止するかもしれstd::mutexません(賢明なコピーを禁止します)。

コピー可能および/または割り当て可能である場合は、セマンティクスを定義します。つまり、コピー/割り当て操作でソースをロックしないかロックします-ロックすることは最も驚くべきことではありません。もちろん、そのままコピー ( double delete[]) するのは安全ではありませんが...

また、同期を抽象化するオブジェクトに問題があるとは思いません。一部の (すべてではない) 場合には理にかなっています。

于 2013-05-31T08:31:22.360 に答える
1
  1. あなたのコードに問題は見当たりません。そして...はい、コードはスレッドセーフになりました(ただし、いくつかの例外がスローされますupdate_score
  2. (失敗した場合やその他の場合)boolから戻る方が良いのではないでしょうか?update_score_safefalsetry_lock()true
  3. ミューテックスを公開することは非常に悪い考えだと私には思えます
  4. なぜあなたは使わないのですstd::vectorか?
于 2013-05-31T08:17:38.983 に答える