4

クラス内にいくつかのプライベート変数(int a、int b、int cなど)があります。いくつかの内部操作のために、スレッドセーフな方法でそのような変数を設定/取得する必要があるため、いくつかのラッピングゲッター/セッターを使用し、スコープ付きミューテックスを使用しました。

void setA(int a)
{
    unique_lock<mutex> lock(opMutex);

    this->a = a;
}

void getA(int a)
{
    unique_lock<mutex> lock(opMutex);

    return a;
}

void setB(int b)
{
    unique_lock<mutex> lock(opMutex);

    this->b = b;
}

void setC(int c)
{
    unique_lock<mutex> lock(opMutex);

    this->c = c;
}

私の質問は: getter/setter メソッド (パブリック変数) を回避し、そのような変数に対する割り当て/読み取り操作でスレッド セーフを維持することは可能ですか?

4

4 に答える 4

4

スレッド セキュリティ同期コードを getter セッターの外に移動し、どこでもミューテックスをロックするボイラープレート コードでコードを肥大化させる場合、ゲッターとセッターを使用しないことは可能ですが、実際には非生産的です。

于 2012-11-20T14:45:29.057 に答える
3

Boost、boost::atomicにも同様のライブラリがありますが、標準の AFAIK にはまだ含まれていません。

于 2012-11-20T15:38:37.950 に答える
3

C++11 がオプションの場合は、 と を併用することを検討しstd::atomic_storestd::atomic_loadくださいatomic_int。ただし、おそらくまだゲッター/セッターを使用する必要があるため、データの管理方法に関する決定 (たとえば、アトミックとミューテックスの選択) は、たとえそれがあなただけであっても、クラスのユーザーには影響しません:)

C++11 がオプションでない場合は、アトミック操作の C++98 互換実装のいずれかを使用できます。私は提案されたブースト アトミック ライブラリをかなり長い間使用してきましたが、インターネットをローミングしている他の実装もあります。

于 2012-11-20T14:50:42.810 に答える
2

使用できますstd::atomic<int> a, b, c;

PS。ブースト タグが表示されていなかったので、C++11 について話していると思いました...

于 2012-11-20T14:47:28.053 に答える