Параллельное и распределенное программирование на С++ - [50]
Введение в библиотеку Pthread
Библиотека Pthread предоставляет API-интерфейс для создания и управления потоками в приложении. Библиотека Pthread основана на стандартизированном интерфейсе программирования, который был определен комитетом по выпуску стандартов IEEE в стандарте POSIX 1003.1с. Сторонние фирмы-изготовители придерживаются стандарта POSIX в реализациях, которые именуются библиотеками потоков Pthread или POSIX.
Рис. 4.10. Модели параллелизма STMD и MTMD
Библиотека Pthread содержит более 60 функций, которые можно разделить на следующие категории.
1. Функции управления потоками.
1.1. Конфигурирование потоков.
1.2. Отмена потоков.
1.3. Стратегии планирования потоков.
1.4. Доступ к данным потоков.
1.5. Обработка сигналов.
1.6. Функции доступа к атрибутам потоков.
1.6.1. Конфигурирование атрибутов потоков.
1.6.2. Конфигурирование атрибутов, относящихся к стекам потоков.
1.6.3. Конфигурирование атрибутов, относящихся к стратегиям планирования потоков.
2. Функции управления мьютексами.
2.1. Конфигурирование мьютексов.
2.2. Управление приоритетами.
2.3. Функции доступа к атрибутам мьютексов.
2.3.1. Конфигурирование атрибутов мьютексов.«
2.3.2. Конфигурирование атрибутов, относящихся к протоколам мьютексов.
2.3.3. Конфигурирование атрибутов, относящихся к управлению приоритетами мьютексов.
3. Функции управления условными переменными.
3.1. Конфигурирование условных переменных.
3.2. Функции доступа к атрибутам условных переменных.
3.2.1. Конфигурирование атрибутов условных переменных.
3.2.2. Функции совместного использования условных переменных.
Библиотека Pthread может быть реализована на любом языке, но для соответствия стандарту POSIX она должна быть согласована со стандартизированным интерфейсом. Библиотека Pthread — не единственная реализация потокового API-интерфейса Существуют другие реализации, созданные сторонними фирмами-производителями аппаратных и программных средств. Например, среда Sun поддерживает библиотеку Pthread и собственный вариант библиотеки потоков Solaris. В этой главе мы рассмотрим некоторые функции библиотеки Pthread, которые реализуют управление потоками.
Анатомия простой многопоточной программы
Любая простая многопоточная программа должна состоять из основного потока и функций, которые будут выполнять другие потоки. Выбранная для реализации модель создания и функционирования потоков определяет, каким образом в программе будут созда ваться потоки и как будет осуществляться управление ими. Потоки создаются по принципу «все и сразу» или при определенных условиях. Пример простой многопоточной программы, в которой реализована модель делегирования, представлен в листинге 4.1.
>// Листинг 4.1. Использование модели делегирования в
>// простой многопоточной программе
>#include
>#include
>void *task1(void *X) //define task to be executed by ThreadA
>{
> //...
> cout << «Thread A complete» << endl;
>}
>void *task2(void *X) //define task to be executed by ThreadB
>{
> //...
> cout << «Thread B complete» << endl;
>}
>int main(int argc, char *argv[])
>{
> pthread_t ThreadA,ThreadB; // declare threads
> pthread_create(&ThreadA,NULL,task1,NULL); // create threads
> pthread_create(&ThreadB,NULL,task2,NULL);
> // additional processing
> pthread_join(ThreadA,NULL); // wait for threads
> pthread_join(ThreadB,NULL);
> return(0);
>}
В листинге 4.1 делается акцент на определении набора инструкций для основного потока. Основным в данном случае является управляющий поток, который объявляет два рабочих потока ThreadA и ThreadB. С помощью функции pthread_create () эти два потока связываются с задачами, которые они должны выполнить (taskl и task2). Здесь (ради простоты примера) эти задачи всего лишь отп равляют сообщение в стандартный выходной поток, но понятно, что они могли бы быть запрограммированы на нечто более полезное. При вызове функции pthread_create () потоки немедленно приступают к выполнению назначенных им задач. Работа функции pthread_join() аналогична работе функции wait() для процессов. Основной поток ожидает до тех пор, пока не завершатся оба рабочих потока. Диаграмма последовательностей, соответствующая листингу 4.1, показана на рис. 4.11. Обратите внимание на то, что происходит с потоками выполнения при вызове функций pthread_create() и pthread_join ().
На рис.4.11 показано, что вызов функции pthread_create() является причиной разветвления, или образования «вилки» в основном потоке выполнения, в результате чего образуются два дополнительных «ручейка» (по одному для каждой задачи), которые выполняются параллельно. Функция pthread_create() завершается сразу же после создания потоков. Эта функция предназначена для создания асинхронных потоков. Это означает, что, как рабочие, так и основной поток, выполняют свои инструкции независимо друг от друга. Функция pthread_join() заставляет основной поток ожидать до тех пор, пока все рабочие потоки завершатся и «присоединятся» к основному.
Рис. 4.11. Диаграмма последовательностей, соответствующая листингу 4.1 |
Компиляция и компоновка многопоточных программ
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.