Коллеги, посоветуйте...
Хочу атомарный rwlock, но не очень понимаю, что и как должно быть в плане memory order. И да, я в курсе голодных писателей в столь наивной реализации.
Хочется что-то вроде этого:
class atomic_shared_mutex
{
public:
atomic_shared_mutex()
: mtx_(0)
{}
void lock() {
// writer пишет в состояние -1
int state = mtx_.load();
while(state != 0 || !mtx_.compare_exchange_strong(state, -1)) {
std::this_thread::yield();
state = mtx_.load();
}
}
void unlock() {
mtx_.store(0);
}
void lock_shared() {
// reader просто увеличивает счётчик собратьев
int state = mtx_.load();
for(;;) {
if(state == -1) {
std::this_thread::yield();
state = mtx_.load();
} else if(mtx_.compare_exchange_strong(state, state+1)) {
break;
}
}
}
void unlock_shared() {
--mtx_;
}
private:
std::atomic<int> mtx_;
};