Итак, я понял, что это работает приемлемым образом.По сути, я снимаю разделяемую блокировку, если необходима запись, и тогда функция записи получит уникальную блокировку.Получив уникальную блокировку в функции записи, он снова проверяет, чтобы убедиться, что операция записи по-прежнему необходима для обработки случая, когда несколько потоков считают, что им нужно записать данные.
Я знаю, что это не так.Идеально, так как время ожидания уникальной блокировки в нескольких потоках, когда уникальная блокировка нужна только одному потоку.Но на данный момент производительность достаточно хорошая, и это значительное улучшение по сравнению с тем, что было раньше.
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(need_write) {
lock.unlock();
writeData();
lock.lock();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::unique_lock<boost::shared_mutex> unique_lock(access_);
if(need_write) {
return;
}
// Do stuff
}
private:
boost::shared_mutex access_;
}