Могут ли несколько потоков получить блокировку одного и того же объекта? - PullRequest
0 голосов
/ 04 августа 2020

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

У меня вопрос о блокировке в контексте нескольких ядер. Если у нас несколько потоков, и они работают в разных ядрах процессора, почему два потока не могут получить одну и ту же блокировку? Как ОС защищает от таких сценариев ios?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Если у нас несколько потоков и они работают в разных ядрах процессора, почему два потока не могут получить одну и ту же блокировку?

Цель мьютекса / блокировки - реализовать взаимное исключение - только один поток может заблокировать мьютекс за раз. Или, другими словами, по определению многие потоки не могут заблокировать один и тот же мьютекс одновременно. Этот механизм необходим для того, чтобы несколько потоков могли сохранять или читать из общего ресурса, не являющегося атомом c, без условий гонки данных .

Как ОС защищает от таких сценариев ios?

Поддержка ОС необходима для предотвращения ожидания потоков при блокировке мьютекса, который уже заблокирован другим потоком. Linux реализации мьютекса (и семафора) используют futex, чтобы перевести ожидающие потоки в спящий режим и разбудить их, когда мьютекс освобождается.

Вот более длинный объяснение Линуса Торвальдса о том, как реализован мьютекс.

0 голосов
/ 04 августа 2020

Блокировка и блокировки предназначены для синхронизации, чтобы предотвратить повреждение данных, когда несколько потоков хотят записывать в одну и ту же память.

Обычно вы запускаете несколько потоков и используете блокировку только в критических ситуациях. Если два или более потока хотят писать в одно и то же место в одно и то же время, то многоядерные вычисления ограничены. Конечно, в этой ситуации вы можете не использовать блокировку, но результаты могут быть непредсказуемыми в этот момент.

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

Если вы хотите разрешить более одного общего доступа к ресурсу, вы можете использовать Semaphore (в java).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...