Если почти всегда требуется синхронизация потоков (т. Е. Использование мьютексов, семафоров, критических разделов и т. Д.), Когда есть доступ к сквозным потокам, даже если это не требуется после прохождения анализ требований?Рекомендации: синхронизация между потоками
ответ
Я бы всегда рекомендовал простейшую и простую схему синхронизации до тех пор, пока анализ не покажет, что вы должны сделать иначе - это обычно означает несколько больших замков по сравнению с многими мелкозернистыми замками или без блокировки.
Проблема в том, что определение правильности кода без блокировки намного сложнее, чем определение правильности соответствующего кода с замками. Это создает большую нагрузку на сопровождающих вашего кода, и есть хорошие шансы, что они ошибаются и вводят ошибки. Даже если вы знаете, что без блокировки безопасно использовать ваш код в настоящее время, это может измениться в будущем людьми, которые не так осведомлены.
Во-вторых, во многих случаях разница в производительности между кодом с блокировками и кодом без блокировки является пренебрежимым - пока вы не знаете, что есть проблема с конфликтом блокировки, вы не должны рассматривать блокировку. Даже если есть проблемы с конфликтом, блокировка не обязательно является лучшим решением.
Спасибо за ваше объяснение. Я полагаю, что использование блокировки было бы лучшей практикой для будущих целей использования исходного кода. – stanigator
Даже если вам не нужны мьютекс, семафор, критический раздел и т. Д. Для их нормальной семантики блокировки, вам все равно может понадобиться memory barrier. Первые конструкции обычно подразумевают барьер памяти, поэтому их удаление может изменить программу. Кроме того, эти проблемы могут быть чрезвычайно сложными для отладки, поскольку другое планирование задействованных потоков может заставить проблему исчезнуть и появиться. В простейшем случае это означает, что простой акт запуска полностью отдельной программы изменяет ваше поведение.
Другая модель, которая имеет смысл, называется share-nothing. erlang и scala, вероятно, являются главными представителями этой модели с процессами erlang и актерами scala.
Идея состоит в том, что вы отправляете сообщения в другие потоки, где сообщения - это данные, данные которых не отправляются отправителем. На практике существует небольшая блокировка, необходимая для очередей отправки/получения, но остальная часть кода может быть заблокирована без каких-либо проблем.
Такие модели могут быть реализованы на языках C++ и других языках.
http://www.scala-lang.org/node/242 http://lambda-the-ultimate.org/node/1742 http://docs.python.org/library/multiprocessing.html#module-multiprocessing
- 1. Синхронизация стеков между потоками
- 2. Синхронизация процесса очистки между потоками
- 3. Синхронизация/отправка данных между потоками
- 4. Синхронизация данных между многими потоками
- 5. Синхронизация очереди между двумя потоками
- 6. Синхронизация между рабочими потоками ExecutorService
- 7. станда :: мьютекса синхронизация между потоками
- 8. Java: синхронизация переменных между потоками
- 9. Синхронизация обратных вызовов между потоками
- 10. Синхронизация событий между двумя потоками в Qt
- 11. синхронизация между потоками с использованием tbb
- 12. Синхронизация доступа к данным между несколькими потоками
- 13. Python: синхронизация ввода и вывода между потоками
- 14. Синхронизация между потоками с использованием критического раздела
- 15. Глобальная переменная синхронизация между потоками в C
- 16. Синхронизация с потоками
- 17. Синхронизация с потоками
- 18. Синхронизация со многими отдельными потоками
- 19. Как передать объект между двумя потоками (синхронизация потоков)?
- 20. Синхронизация структур Уплотненных данных между потоками в Java
- 21. Синхронизация обратных вызовов между различными потоками в Android
- 22. Синхронизация между асинхронными потоками в silverlight CRM 2011
- 23. Синхронизация ввода клавиатуры между двумя потоками в Java-игре
- 24. Создание задержки между потоками
- 25. Синхронизация общего объекта, который используется рабочими потоками
- 26. Синхронизация выхода STD cout с несколькими потоками
- 27. Отличие между потоками Java и потоками ОС?
- 28. Разница между несинхронизированными потоками и синхронизированными потоками
- 29. Разница между потоками SwingUtilities и потоками AWT.EventQueue
- 30. Синхронизация с Async - рекомендации по синхронному асинхронному
Если это не требуется, это не требуется. Что именно вы спрашиваете? – sth
Должен ли я блокировать потоки при доступе к данным через потоки независимо от того, требуется ли это или нет? – stanigator
Если это необходимо (чтобы избежать повреждения данных), сделайте это. Если это не требуется, не делайте этого ... –