Выгодно ли использовать потоки в Windows? - PullRequest
0 голосов
/ 09 января 2009

Некоторые сотрудники в офисе считают, что когда они добавят потоки в свой код, Windows назначит эти потоки для работы на разных процессорах многоядерной или многопроцессорной машины. Затем, когда этого не происходит, все обвиняют в существовании этих потоков, сталкивающихся друг с другом на упомянутой многоядерной или многопроцессорной машине.

Может ли кто-нибудь разоблачить или подтвердить это понятие?

Ответы [ 5 ]

6 голосов
/ 09 января 2009

Когда приложение порождает несколько потоков, они действительно могут быть назначены разным процессорам. На самом деле, нередко некорректный многопоточный код нормально работает на однопроцессорной машине, но затем отображает проблемы на многопроцессорной машине. (Это происходит, если код безопасен перед временным разделением, но нарушен перед лицом истинного параллелизма.)

2 голосов
/ 09 января 2009

Windows автоматически выполнит несколько потоков на разных процессорах, если на машине установлено несколько процессоров. Если вы работаете на однопроцессорном компьютере, потоки разделены по времени, но когда вы перемещаете процесс на многопроцессорный компьютер, процесс автоматически использует преимущества нескольких процессоров.

Поскольку код выполняется одновременно, потоки могут с большей вероятностью наступать друг другу на пальцы на многоядерном компьютере, чем на одноядерном компьютере, поскольку оба потока могут одновременно выполнять запись в общее местоположение вместо это происходит, если обмен потоками рассчитан как раз.

2 голосов
/ 09 января 2009

Да, многопоточность и многопоточность почти не имеют отношения к числу процессоров или ядер в машине ...

РЕДАКТИРОВАТЬ ДОБАВЛЕНИЕ: говорить о том, «сколько потоков выполняется на одном процессоре», - оксюморон. Только один поток может работать на одном процессоре. Многопоточность - это несколько потоков в ПРОЦЕССЕ, а не в ЦП. Прежде чем другой поток может быть запущен на любом процессоре, поток, который в данный момент находится на этом процессоре, должен прекратить работу, и его состояние должно быть сохранено где-то, чтобы ОС могла перезапустить его, когда получит следующий «ход».

Код выполняется в «Процессах», которые представляют собой логические абстракции, которые могут выполнять одну или несколько последовательностей инструкций кода и независимо управлять ресурсами компьютера от других процессов. Внутри процесса каждая отдельная последовательность инструкций кода является «потоком». На каком процессоре они работают, не имеет значения. Один поток может работать на другом процессоре каждый раз, когда ему назначается процессор для выполнения ... и несколько потоков, поскольку каждый из них назначен циклам процессора, могут, по совпадению, работать на одном процессоре (хотя, очевидно, не одновременно)

ОС (компонент ОС) отвечает за "запуск" потоков. Он хранит в памяти список всех потоков и постоянно «переключается» (это называется переключением контекста) между ними. Он делает это на машине с одним процессором почти точно так же, как на машине с несколькими процессорами. Даже на компьютере с несколькими процессорами каждый раз, когда он «включает» поток, он может передавать его другому процессору или тому же процессору, как в прошлый раз.

2 голосов
/ 09 января 2009

Обычно вы можете оптимально иметь только 1 поток на процессор, но если ваше приложение не имеет явной привязки потоков к одному процессору, то да, Windows назначит эти потоки свободному процессору.

0 голосов
/ 09 января 2009

Нет гарантии, что потоки вашего процесса будут назначены для работы на разных процессорах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...