Блокировки RW с блокировкой иерархии

#multithreading #concurrency

#многопоточность #параллелизм

Вопрос:

Я пытаюсь создать систему блокировки иерархии, чтобы избежать взаимоблокировок. Это означает разбивать код на уровни (или уровни) и на каждом уровне разрешать блокировки только на следующем уровне. Внутри того же уровня вы должны заблокировать с предопределенным порядком. Это предотвращает большинство взаимоблокировок. Что-то вроде этого http://www.drdobbs.com/parallel/use-lock-hierarchies-to-avoid-deadlock/204801163?pgno=1

Для мьютекса это будет работать как шарм, но для блокировок чтения и записи это не удается. Например, если я беру блокировку чтения, а затем хочу включить ее для блокировки записи, это означает, что я беру новую блокировку на том же уровне, что запрещено этим алгоритмом.

Как изменить алгоритм для работы с блокировками RW и мьютексов? Есть ли какой-то другой алгоритм, который я должен рассмотреть?

PS: Я программирую C , но вопрос на самом деле является актуальным и теоретическим

Комментарии:

1. Что вы подразумеваете под блокировкой чтения и записи?

2. Не могли бы вы отредактировать вопрос, чтобы он был автономным? Если эта ссылка когда-либо разорвется, это оставит вопрос, который больше не понятен. Это также повысит качество вопроса, когда его можно будет прочитать за один раз.

3. Я добавил, но блокировка иерархии — это известный алгоритм, поэтому проблем быть не должно

4. @Jackson, блокировки чтения и записи точно такие, как вы описали в своем ответе, блокировка чтения — это общая блокировка, которую могут удерживать несколько потоков. Когда вы пишете lock, вы ждете, пока читатели перейдут на финский и получат эксклюзивную блокировку

5. эта библиотека выполняет многоуровневые блокировки чтения и записи: github.com/AtakamaLLC/hilok . где вы можете заблокировать родительский и дочерний элементы.

Ответ №1:

Учитывая, что блокировка чтения для объекта A может удерживаться более чем 1 потоком, в то время как блокировка записи должна удерживаться только 1 потоком и не может быть предоставлена, если есть какие-либо блокировки чтения (мое понимание по умолчанию того, что такое блокировки чтения и записи), вы не можете этого сделать.

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

Если, однако, ваша блокировка чтения может удерживаться только одним потоком, то чем она отличается от блокировки записи? Если у вас есть блокировка, у вас есть эксклюзивный доступ к заблокированному think.

Комментарии:

1. вы правильно понимаете, если поток A получил на уровне 2 блокировку чтения и некоторую блокировку мьютекса, а затем я разблокирую блокировку чтения, тогда мне не разрешается снимать блокировку записи. потому что блокировки должны быть в согласованном порядке на каждом уровне

2. @Epic В этом случае, я думаю, все, что вы можете сделать, это освободить существующие блокировки на этом уровне, а затем повторно получить их с помощью блокировки записи вместо блокировки чтения.