Блокировка (Распараллеливает) атомарный?

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

Т.Е.: процессор может быть прерван, или контекстное переключение может произойти, в то время как тот ресурс имеет блокировку на нем? Если это делает, то ничто иное не может получить доступ к этому ресурсу, пока это не запланировало, въезжают задним ходом для завершения, это - процесс. Походит на дорогую операцию.

11
задан Jim Ferrans 6 February 2010 в 17:29
поделиться

3 ответа

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

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

16
ответ дан 3 December 2019 в 04:13
поделиться

Да, переключение контекста определенно может произойти. Именно поэтому при доступе к общему ресурсу важно также заблокировать его от другого потока. Когда поток A имеет блокировку, поток B не может получить доступ к заблокированному коду.

Например, если два потока выполняют следующий код:

1. lock(l);
2. -- change shared resource S here --
3. unlock(l);

Переключение контекста может произойти после шага 1, но другой поток не может удерживать блокировку в это время и, следовательно, не может изменить общий ресурс. Если доступ к общему ресурсу в одном из потоков осуществляется без блокировки - могут случиться неприятности!

Что касается расточительности, да, это расточительный метод. Вот почему существуют методы, которые пытаются вообще избежать блокировок. Эти методы называются lock-free , и некоторые из них основаны на службах сильной блокировки, таких как CAS (Compare-And-Swap) или другие.

2
ответ дан 3 December 2019 в 04:13
поделиться

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

7
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: