Допустим, есть класс:
class LockFree
{
LockFree(int num) : n(num) {}
int next() {n += 1; return n;}
private:
int n;
};
Какие есть стандартные методы организовать lock-free доступ к n?
То есть, интересует lock-free (без мьютексов) реализация функции next(), которую можно было бы использовать в многопоточной многоядерной системе.
Было бы круто узнать как о возможностях современного стандарта (вероятно это std::atomic + варианты compare_exchange), так и о самопальных велосипедах, которые можно было бы использовать в plain c.
Ответ
Самый простой метод:
class LockFree
{
LockFree(int num) : n(num) {}
int next() {return ++n;}
private:
std::atomic
Это покроет все Ваши нужды в 99% случаев.
а если next() будет вида next() { return n + n^2 + n^3; }
Тогда будет так:
int next()
{
int oldN = n;
while(true)
{
int newN = oldN + oldN*oldN + oldN*oldN*oldN;
if(n.compare_exchange_strong(oldN, newN))
return newN;
}
}
Комментариев нет:
Отправить комментарий