Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

Многопроцессорные ПК - что стоит знать?

#c_sharp #net


К примеру есть многопоточное приложение (Task + Async\Await, в редких случаях Thread),
частично на управляемом коде, частично - на неуправляемом. На однопроцессорной системе
приложение работает стабильно.

Могут ли возникнуть баги при использовании на многопроцессорной системе? Что стоит
знать при разработке приложений под многопроцессорные системы? Какие особенности, костыли,
известные баги? Чего стоит ожидать?
    


Ответы

Ответ 1



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

Ответ 2



Если мне не изменяет память на Windows вытесняющая многозадачность, поэтому грабли и косяки на однопроцессорной (даже без учёта Hyper-Threading) и многопроцессорной машине будут идентичны. Естественно при большем распараллеливании вероятность коллизий умножается.

Комментариев нет:

Отправить комментарий