семафор получает доступ к той же структуре данных - PullRequest
0 голосов
/ 31 мая 2018

Я бы хотел лучше понять семафор.Семафор позволяет X количеству потоков (скажем, 10 потоков обращаются к одной и той же функции потока) для входа в определенную функцию потока, так что произойдет, если все 10 потоков будут пытаться получить доступ к одной и той же структуре данных в одно и то же время.Нужен ли нам какой-либо дополнительный механизм блокировки, чтобы избежать этой ситуации.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Для части вашего вопроса - что происходит, когда два потока пытаются получить атомарный ресурс в точно * в то же время .Ответ - , это не происходит точно в одно и то же время.

Эти атомарные операции нуждаются в поддержке на аппаратном уровне.В случае нескольких потоков / процессов всегда будет тот, кто получает аппаратную блокировку и использует атомарные инструкции (например, LOCK и CMPXCHG в архитектуре Intel) до того, как это сделает другой поток / процесс.

0 голосов
/ 31 мая 2018

Предположим, у вас есть семафор:

val s: Semaphore(1)

, который определяет семафор с начальным счетом 1.

Затем доступ к функции осуществляется с помощью:

s.await()
invoke_function()
s.notify()

Если у вас есть 10 потоков, то каждый поток будет выполнять await() на семафоре, но одновременно может продолжаться только один поток.Работа семафора гарантирует, что только один поток может одновременно выполнять invoke_function().

Наконец, notify() на семафоре освобождает ресурс и позволяет другому потоку получить доступ к функции.

Область между await() и notify() часто называется критической секцией .Сам семафор обеспечивает блокировку доступа к структуре данных.

Однако эта модель управления потоками пропускает ряд проблем, связанных с базовой моделью памяти.

...