К примеру есть многопоточное приложение (Task + Async\Await, в редких случаях Thread), частично на управляемом коде, частично - на неуправляемом. На однопроцессорной системе приложение работает стабильно.
Могут ли возникнуть баги при использовании на многопроцессорной системе? Что стоит знать при разработке приложений под многопроцессорные системы? Какие особенности, костыли, известные баги? Чего стоит ожидать?
Ответ
Проблемы могут быть при несинхронизированном доступе к разделяемой между потоками памяти.
Например, если один из потоков меняет значение разделяемой переменной, а другой читает её без синхронизации, и эти потоки попадут на разные процессоры, то у них может оказаться разное мнение по поводу содержания переменной. Если управляющая логика завязана на значение переменной, получится deadlock.
Если вы пользуетесь Task'ами, во многих случаях переход из потока в поток сделает для вас фреймворк автоматически, с нужной расстановкой memory barrier'ов (но всё же проверьте для случая, если вы пользуетесь нестандартным SyncronizationContext'ом). Использование общих переменных для коммуникации между бегущими Task'ами всё так же плохо и не рекомендуется — впрочем, с async/await такого практически никогда и не надо.
Комментариев нет:
Отправить комментарий