совет по memory model
От: sokel Россия  
Дата: 06.05.15 21:45
Оценка:
Коллеги, посоветуйте...
Хочу атомарный 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_;
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.