Решение покинуть shared_mutex было принято независимо от каких-либо проблем с качеством.Это решение было частью «компромисса Kona», достигнутого осенью 2007 года. Этот компромисс был нацелен на сокращение набора функций C ++ 0x для обеспечения поставки стандарта к 2009 году. Это не сработало, но, тем не менее, этоявляется обоснованием.
shared_mutex будет обсуждаться для включения в технический отчет (т. е. tr2) после того, как комитет завершит C ++ 0x.Председатель рабочей группы библиотеки уже связался со мной по этому вопросу.Это не означает, что shared_mutex будет в tr2.Просто это будет обсуждаться.
Ваша реализация AquireReadLock и AquireWriteLock имеет недостаток в том, что они используют фрейм стека со скоростью один раз в секунду, когда находятся в состоянии конфликта.И когда спор закончен, они задерживаются до секунды, прежде чем реагируют.Это приводит к тому, что они и стекаются, и работают плохо (извините).
Если вам интересно, здесь есть полное описание и реализация shared_mutex:
http://home.roadrunner.com/~hinnant/mutexes/locking.html
Код не является частью Boost, но имеет расширенную лицензию с открытым исходным кодом.Не стесняйтесь использовать его, просто сохраните авторское право с исходным кодом.Других строк нет.Вот его аналог вашего AquireReadLock:
void
shared_mutex::lock_shared()
{
std::unique_lock<mutex_t> lk(mut_);
while ((state_ & write_entered_) || (state_ & n_readers_) == n_readers_)
gate1_.wait(lk);
count_t num_readers = (state_ & n_readers_) + 1;
state_ &= ~n_readers_;
state_ |= num_readers;
}
А вот его аналог вашему AquireWriteLock:
void
shared_mutex::lock()
{
std::unique_lock<mutex_t> lk(mut_);
while (state_ & write_entered_)
gate1_.wait(lk);
state_ |= write_entered_;
while (state_ & n_readers_)
gate2_.wait(lk);
}
Я считаю это хорошо проверенным и высокопроизводительным, честным чтением /написать мьютексную реализацию для C ++.Если у вас есть идеи о том, как его улучшить, я бы приветствовал их.