how to use std::atomic<>のstd :: btween違い、原子とstd :: mutexの上記の質問で
は、明らかに私たちは、スレッドの安全性を保つためにstd::mutex
を使用することができます。私はいつどちらを使うべきかを知りたい。経験則として
classs A
{
std::atomic<int> x;
public:
A()
{
x=0;
}
void Add()
{
x++;
}
void Sub()
{
x--;
}
};
と
std::mutex mtx;
classs A
{
int x;
public:
A()
{
x=0;
}
void Add()
{
std::lock_guard<std::mutex> guard(mtx);
x++;
}
void Sub()
{
std::lock_guard<std::mutex> guard(mtx);
x--;
}
};
'x'はインスタンス変数です。クラスAのすべてのインスタンスを変更するすべてのスレッドに対して1つの大きなロックを持つ代わりに、クラスメンバをmutexにすることで、きめ細かいロックを得ることができます(もちろん、各Aオブジェクトのサイズが大きくなります)。 –
少なくとも理論的には、C++ UBを避けるためには、読み取り専用アクセッサ関数でもロックを取る必要があります。 (これはstd :: atomicの大きな利点です:読み込み専用アクセスははるかに安いです)。 –