Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Варианты реализации lock-free алгоритма

Допустим, есть класс:
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 n; };
Это покроет все Ваши нужды в 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; } }

Комментариев нет:

Отправить комментарий