2013-06-26 2 views
8

Я хотел бы контролировать доступ к геттерам и сеттерам для кучи классов данных, чтобы сделать их безопасными доступными из нескольких потоков одновременно. Я уже делал это на Java с помощью java.util.concurrent.locks.ReentrantReadWriteLock, и это было довольно безболезненно.Есть ли эквивалент C++ для java.util.concurrent.locks.ReentrantReadWriteLock?

Но теперь у меня много проблем в моем текущем проекте на C++, потому что я не могу найти повторную реализацию блокировки чтения/записи. В частности, я хочу, чтобы поток позволял потоку получать блокировку чтения, если он уже имеет блокировку записи, без блокировки и без отказа от блокировки записи.

Причина проста: некоторые из моих методов сеттера называют методы getter, а первые (обычно) получают блокировки записи, а последние считывают блокировки. Я не хочу искажать мою прямолинейную архитектуру getter/setter, чтобы обойти ограничения в классах блокировки.

Я пробовал Qt (4.8) QReadWriteLock и связанные с ним классы, а также уникальные возможности Boost и shared_lock. Ни одна из библиотек не реализует необходимое мне обновление. Означает ли какая-то другая часть Boost это?

Или есть ли другая библиотека, которая имеет это? Я действительно удивлен, что ни Qt, ни Boost не выглядят так, как кажется, такой явно желательной особенностью. (И который был частью стандартной библиотеки Java с 2004 года.)

+0

Разве это не конфигурируемый вариант как опция рекурсивного замка? Похоже, мне может понадобиться освежить себя! – Huy

+0

@ Huytard: Спасибо за быстрый ответ. Это позволяет вам получать один и тот же замок более одного раза в одном потоке. Полезно, но недостаточно для моих нужд. – Chris

+2

heh, много лет назад я попытался убедить сопровождающих библиотеки блокировки ускорения сделать повторных попыток блокировок, но они были в корне противоположны концепции блокировки повторного входа. У меня такое чувство, что мы поддерживали нашу собственную вилку, у которой была поддержка повторного участия, что было довольно тривиально. – jtahlborn

ответ

3

Как человек, который много работал с C++, я не уверен, что вы найдете эту функцию в широко распространенной библиотеке. Насколько я знаю, увеличение потоков, потоков std и потоков POSIX не позволяет этого.

В результате, для того, чтобы решить проблему, которую я хотел бы предложить следующее:

  1. Взгляните еще раз на вашу схему блокировки и данные, которые вы обмен. Есть ли другой способ, которым вы можете выполнить то, что вы собираетесь делать?

  2. Попытайтесь реализовать свою версию созданных вами блокирующих примитивов. Это должно быть просто простое расширение примитивов, которые уже доступны в любой библиотеке, которую вы выберете. Кроме того, поделитесь им с сообществом, так как я уверен, что вы не будете единственным с этой проблемой.