how to use std::atomic<>Разница btween станд :: атомное и станд :: мьютекс
В вопросе выше, очевидно, мы можем просто использовать 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. (Это, конечно, увеличивает размер каждого объекта A.) –
Не забывайте, что даже функция доступа только для чтения также должна блокировать, по крайней мере теоретически, чтобы избежать C++ UB. (Это огромное преимущество для std :: atomic: доступ только для чтения намного дешевле). –