boost :: unique_lock / upgrade_to_unique_lock && boost :: shared_lock может существовать одновременно? меня это беспокоит - PullRequest
0 голосов
/ 12 апреля 2011

Я провел эксперименты с boost :: upgrade_to_unique_lock / unique_lock && boost :: shared_lock, сценарий:

  • 1 поток записи, где он имеет boost :: unique_lock, существующий с boost:: shared_mutex, в потоке я пишу в глобальный AClass

  • 3 поток чтения, каждый из них имеет boost :: shared_lock с таким же бустом:; shrared_mutex,у них есть цикл для чтения глобальной AClass

Я заметил, что все потоки удерживают блокировки (1 уникальная, 3 общих) одновременно, и все онивыполнение циклов доступа к данным.

меня беспокоит AClass не поточно-ориентированный, если я могу одновременно выполнять чтение / запись в разных потоках, чтение может привести к сбою.Даже если это не AClass, мы используем примитивные типы, их чтение, безусловно, не приведет к сбою, но данные могут быть грязными, не так ли?

1 Ответ

3 голосов
/ 12 апреля 2011
boost::shared_lock<boost::shared_mutex>(gmutex);

Это не «безымянный замок».Это создает временный объект shared_lock, который блокирует gmutex, затем этот временный объект shared_lock уничтожается, разблокируя gmutex.Вам необходимо присвоить объекту имя, сделав его переменной, например:

boost::shared_lock<boost::shared_mutex> my_awesome_lock(gmutex);

my_awesome_lock будет уничтожено в конце блока, в котором он объявлен, что является желаемым поведением.

...