Я не понимаю, как это должно работать, потому что независимо от того, в какое время (test_and_set (& lock) возвращается, является ли оно истинным или ложным, код {} будет по-прежнему запускать критический раздел. ничего не делать, а затем сразу же запустить критическую секцию, так как это поможет синхронизировать нити?Как работает этот алгоритм синхронизации?
ответ
это не независимо от того, что test_and_set
возвращается. Обратите внимание, что test_and_set
возвращает предыдущее значение местоположения, предоставленного ему, так while(test_and_set(&lock));
(примечание завершающая точка с запятой!) будет вращаться на процессоре, а другой поток «владеет» блокировкой.
Обратите внимание, однако, что ваша фактическая реализация test_and_set
не является атомарной и, следовательно, фактически не потокобезопасна.
Возможно, это поможет, если я переформатирую ваш код, чтобы выглядеть так?
do {
while (test_and_set(&lock)) {
/* do nothing */
}
/* critical section */
lock = false;
/* remainder section */
} while (true);
Итак, если это lock = true, он ничего не делает, и если lock = false, он запускает критический раздел, а затем помещает lock в false, чтобы другой поток мог запускать его? Как бы вы сделали его атомарным? – fogofwar
Вы не можете сделать его атомарным, используя только код C. Вам нужна некоторая или другая форма поддержки нижнего уровня, например, инструкции по блокировке шины или (на однопроцессорных машинах) прерывание прерывания. Такие вещи часто предоставляются стандартными библиотеками, но они специфичны для каждой платформы, поэтому нет универсального ответа, не зная платформы. – Dolda2000
- 1. , пожалуйста, нарушите этот алгоритм синхронизации.
- 2. Как работает этот алгоритм?
- 3. Как работает этот обратный алгоритм?
- 4. Как работает этот алгоритм сортировки?
- 5. Алгоритм синхронизации порядка записей
- 6. Пожалуйста, объясните, как работает этот алгоритм перестановок, а также как работает этот алгоритм палиндрома
- 7. Почему этот алгоритм сортировки работает?
- 8. Как работает этот алгоритм генерации лёссографских ордеров?
- 9. Алгоритм синхронизации сообщений
- 10. Алгоритм синхронизации CALDAV
- 11. Bakery алгоритм синхронизации процессов
- 12. Алгоритм синхронизации в Python
- 13. Как объявить этот алгоритм?
- 14. Работает ли этот нестандартный шаблон синхронизации Java?
- 15. Почему этот пример синхронизации не работает?
- 16. Как называется этот метод синхронизации?
- 17. Как оптимизировать этот алгоритм
- 18. Как разработать этот алгоритм?
- 19. Как называется этот алгоритм?
- 20. Как ускорить этот алгоритм?
- 21. Алгоритм синхронизации дат SQL Server
- 22. Воспроизведение: алгоритм синхронизации аудио-видео
- 23. Почему этот алгоритм (алгоритм Флойда Варшала) работает только для 100000007?
- 24. Непонятно, почему работает этот алгоритм смены монеты
- 25. Почему этот повторяемый случайный алгоритм не работает?
- 26. Почему этот алгоритм сортировки LinkedList работает?
- 27. Как называется этот общий алгоритм?
- 28. Почему этот обратный алгоритм не работает?
- 29. Алгоритм синхронизации атрибутов в записях
- 30. Почему этот алгоритм работает для обратного бита
Это, очевидно, не является потокобезопасным. Кто говорит, что это так? – usr
'while (test_and_set (& lock));' будет зацикливаться до тех пор, пока не станет ложным, а затем запустит критический раздел. Не совсем понимаю, что делает 'test_and_set', хотя – clcto
Это на любой конкретной платформе, на которую вы нацеливаетесь? потому что есть встроенные функции платформы, которые, вероятно, сделают это * правильно * для вас. Чтобы ответить на ваш вопрос о том, как это работает, честно говоря, * это не * (конечно, не надежно). – WhozCraig