Я имею дело с многопоточным кодом, написанным моим предшественником в приложении C# WinForm, которое обрабатывает большие объемы данных одновременно в производственной среде. Я определил, что в некоторых точках кода используется Thread.Sleep (20). Я не очень разбираюсь в многопоточности и имею базовые знания о примитивах потоков и синхронизации. Мне нужно знать, существуют ли какие-либо опасности, связанные с Thread.SleepКаковы опасности Thread.Sleep в многопоточном коде в производственной среде
ответ
Это не будет явно или напрямую опасно. Это почти наверняка тратит силы, так как явное принуждение вашей программы не выполнять работу, когда она работает, почти никогда не бывает разумной.
Это также довольно значительный красный флаг, что в коде есть условие гонки, и вместо того, чтобы на самом деле выяснить, что это такое или как его исправить, программист просто добавил в Sleep
звонки, пока не прекратил его видеть. Если это правда, это будет означать, что программа по-прежнему нестабильна и может потенциально сломаться в любое время, если изменится достаточно других переменных, и что проблема должна быть фактически исправлена с использованием надлежащих технологий синхронизации.
Я думаю, что цель использования 'Sleep', вероятно, должна была дать поток, а не синхронизировать потоки. – dcastro
@dcastro Это возможно, хотя мне еще предстоит увидеть ситуацию, в которой это действительно подходит; в общем случае нить имеет что-то значимое, или если это не так, она должна ждать некоторого сигнала, а не фиксированного периода времени. Это показатель оживленной активности, которая почти всегда является признаком того, что что-то не так где-то (и занятая жизнь - это [бедная] форма синхронизации). – Servy
Sleep() не заставляет вас не выполнять работу. Это запрос от вызывающего потока, чтобы приостановить его выполнение на временной интервал. Другие потоки в программе (и потоки в других процессах) могут продолжать продвигаться вперед. Если, например, в каком-то сложном потоке управления процессом в некоторых случаях необходимо ждать не менее пяти секунд, то Sleep (5000) является вполне разумным решением. Это просто, не требует дополнительного таймера или потока/пула и будет работать в любом месте стека вызовов, не переписывая код в качестве государственной машины. –
- 1. Каковы опасности использования Singleton в многопоточном приложении
- 2. Метеор: каковы наилучшие настройки в производственной среде?
- 3. Katta в производственной среде
- 4. Glassfish в производственной среде?
- 5. Маршрутизация Rails в производственной среде
- 6. Каковы риски использования SharePoint Designer в производственной среде?
- 7. Каковы возможные проблемы, связанные с DB Link в производственной среде?
- 8. Найти ошибку в многопоточном коде
- 9. Server Trust Issue В производственной среде
- 10. Регистрация в многопоточном коде Async
- 11. Использование node.js в производственной среде
- 12. Оптимизация журналов в производственной среде
- 13. AWS ElasticBeanstalk в производственной среде
- 14. EHCache неудачу в производственной среде
- 15. Опасности небезопасных общих переменных в потоковой среде
- 16. Частые лаги в многопоточном коде
- 17. NullPointerException в многопоточном коде Java
- 18. JBOSS Console Logging, рекомендуется в производственной среде?
- 19. Sidekiq retry только в производственной среде
- 20. рабочий поток не уведомлен в многопоточном коде
- 21. Относительный путь в игровой среде 2.3.6 в производственной среде
- 22. Использование события F # в многопоточном коде
- 23. Сайт Tornado, работающий на производственной среде Windows
- 24. appprodUrlGenerator не найден в производственной среде
- 25. Маршрутизация Symfony2 не работает в производственной среде
- 26. Проблемы с рельсами 4 в производственной среде
- 27. Geocoder Gem не работает в производственной среде
- 28. Архитектура SQL Server в производственной среде
- 29. notify_observers не работает в производственной среде
- 30. UglifyJS не работает в производственной среде Symfony2
Thread.sleep заставляет вашу нить спать ровно столько времени. Что делать, если ваш поток нужен только 'sleep (10)'? Вы теряете время. Есть и другие способы сделать это (я не знаю C#, вот почему это не ответ). Но в Java, например, мы «syncronized». – Shondeslitch
Парень, который написал это, вероятно, имел в виду использовать «Thread.Sleep» как средство для * not * hog a thread и дать другим потокам возможность выполнить. Он должен, однако, использовать 'Thread.Yield' – dcastro
возможный дубликат [Почему Thread.Sleep настолько вреден] (http://stackoverflow.com/questions/8815895/why-is-thread-sleep-so-harmful) – ZunTzu