Ответ на ваш вопрос приходит в виде двух, казалось бы, противоречащих друг другу утверждений:
1: Это уже так
а также
2: Вы не можете
Современные операционные системы и, следовательно, среды разработки используют потоки. Поток, по сути, представляет собой одну серию последовательных шагов (и слов, которые не начинаются с буквы "S"), которые будет выполнять процессор. Эти потоки управляются операционной системой и архитектурой процессора, при этом процессор выполняет некоторую часть (или весь) потока, сохраняет свое состояние, а затем переключается на другой поток.
При наличии нескольких ядер (будь то многоядерные процессоры, или просто несколько процессоров, или и то, и другое), компьютер на самом деле может выполнять два потока одновременно, предполагая, что они читают и записывают разные области памяти (потоки, которые используют одни и те же ресурсы требуют синхронизации, что представляет собой сложную игру в мяч внутри этого), путем распределения потоков по ядрам.
Рискуя использовать слишком упрощенное сравнение, подумайте об этом так: ваш код в его нынешнем виде представляет собой просто очень длинный список шагов, которые необходимо выполнить для выполнения конкретной задачи. Теперь вы взяли этот список инструкций в комнату, полную людей (каждый из которых представляет процессорное ядро), и вы хотели бы использовать каждого из этих людей как можно эффективнее. В то время как комната, полная аспирантов, может иметь контекст и знания по предмету, чтобы понять, как разбить ваши инструкции на задачи для каждого отдельного человека, вы принесли свой список в комнату, полную людей, которые отлично следуют указаниям. но совершенно глупо, когда дело доходит до дедукции. В этом случае вам нужно предоставить разные наборы инструкций для каждого человека, чтобы при выполнении всех вы получили один и тот же результат.
Проще говоря, чтобы ваш код мог использовать преимущества нескольких ядер или процессоров, вы должны разбить свою работу на небольшие, предпочтительно атомарные фрагменты кода. Конкретный метод, который вы используете для разбиения кода на несколько потоков, может различаться; использование System.Threading.ThreadPool или недавно представленной библиотеки параллельных задач может упростить некоторые из этих вещей, хотя всегда есть компромисс (как и во всем) либо в эффективности, либо в контроле.
Для более подробного изучения потребуется взглянуть на ваш фактический код. Вам лучше найти кого-то с опытом написания надежного, производительного многопоточного кода (если возможно, кто-то с недавним опытом работы с .NET, так как это поможет определить, какие библиотеки будут подходящими).
person
Adam Robinson
schedule
07.03.2011