Здравствуйте, sokel, Вы писали:
S> дополнительное relaxed чтение при блокировке читателем.
Хотя на кой чёрт чтение, можно же с оптимизмом предположить, что читатель первым захватывает блокировку.
Тогда достаточно одного CAS:
void lock_shared() {
int state = 0;
for(;;) {
if(mtx_.compare_exchange_weak(state, state+1, std::memory_order_acquire))
break;
if(state < 0) {
// мьютекс занят писателем - прерываем поток
// при возврате опять попытаемся быть первыми
state = 0;
std::this_thread::yield();
}
}
}