Если вы используете систему на основе POSIX (Linux, FreeBSD, Mac OS X и т. Д.), Вам нужно проверить pthreads (ссылка на учебник). Pthreads существует уже давно и является стандартом де-факто для параллельного программирования на платформах на основе POSIX.
Однако есть новичок, известный как Grand Central Dispatch (ссылка на учебник). Технология была разработана Apple (в Snow Leopard) в попытке решить некоторые из утомительных проблем, связанных с многопоточным и многопоточным программированием в целом. В частности:
Блоки (анонимные функции) введены в язык C (расширение C ++ и Objective-C). Это позволяет полностью избежать использования контекстных структур. В примере (интенсивно использующем псевдокод) вы можете написать что-то вроде этого, используя pthreads:
typedef struct { int val1; int val2; } context;
int main(){
int firstval = 5;
int secondval = 2;
context *c = malloc(sizeof(context));
c->val1 = firstval;
c->val2 = secondval;
create_new_thread(context, myFunct);
}
void myFunct(context *c){
printf("Contrived example %d %d", c->val1, c->val2);
}
Это потребовало много работы - нам пришлось создать контекст, настроить значения и убедиться, что наша функция обрабатывает получение контекста правильно. Не так с GCD. Вместо этого мы можем написать следующий код:
int main(){
int firstval = 5;
int secondval = 2;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
printf("Contrived example %d %d", firstval, secondval);
});
}
Обратите внимание, насколько это было проще! Нет контекста, даже не отдельная функция.
GCD позволяет ядру управлять счетчиком потоков. Каждый поток в вашей системе потребляет некоторые ресурсы ядра. На портативном устройстве избыточные потоки приводят к сокращению срока службы батареи. На любом компьютере избыточные потоки приводят к снижению производительности. Что означает «избыток»? Нерест сотен нитей на 2-ядерном компьютере. При использовании pthreads вам приходилось явно управлять количеством потоков, следя за тем, чтобы не перегружать систему. Конечно, это очень сложно сделать. С GCD вы просто говорите ядру: «Выполните этот блок работы, когда у вас есть такая возможность» - ядро решает, когда у него достаточно свободных ресурсов для выполнения фрагмента кода - вам не нужно об этом беспокоиться.
Помимо обеспечения отличной базовой поддержки многопоточности, GCD также позволяет вашей программе взаимодействовать с «источниками» через блоки. Таким образом, вы можете поставить дескриптор файла в очередь и сказать GCD «запустить этот блок кода, когда появятся новые данные для чтения». И поэтому ядро позволит вашей программе бездействовать до тех пор, пока не поступит достаточно большое количество данных, а затем автоматически поставит в очередь ваш блок!
И я лишь коснулся того, что может сделать GCD. Это действительно удивительная технология, и я настоятельно рекомендую вам ознакомиться с документами . В настоящее время он доступен в Mac OS X и FreeBSD и имеет открытый исходный код, поэтому, если вы хотите, чтобы он работал в Linux, вы можете его портировать:).
Если вы ищете необработанную мощность для параллельных приложений, Apple разработала еще одну замечательную технологию (также для Snow Leopard) под названием OpenCL , которая позволяет вам использовать возможности графического процессора в очень простой C-подобный (это почти точно C с несколькими оговорками) язык. У меня не было большого опыта с этим, но из всего, что я слышал, он прост в использовании и очень мощный. OpenCL является открытым стандартом , с реализациями в Mac OS X и Windows.
Итак, подведем итог: pthreads для всех систем на основе POSIX (это некрасиво, но это стандарт де-факто), GCD для Mac OS X и FreeBSD и OpenCL для параллельных приложений, где вам нужны все сила, которую вы можете получить!