etc:teach:parallel:threads
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
etc:teach:parallel:threads [2007/10/29 09:46] – kkv | etc:teach:parallel:threads [2008/01/03 02:32] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | FIXME в разработке | ||
+ | |||
==== Процессы, | ==== Процессы, | ||
Line 21: | Line 23: | ||
* имеет доступ к ресурсам процесса | * имеет доступ к ресурсам процесса | ||
* Аквариум с рыбами | * Аквариум с рыбами | ||
+ | |||
+ | === Примитивы pthreads === | ||
+ | |||
+ | == Создание == | ||
+ | * int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), | ||
+ | * thread OUT В результате успешного срабатывания функции по указанному адресу будет размещен описатель порожденного потока. | ||
+ | * attr IN Атрибуты потока. Задают свойства потока. Может быть NULL. Описание атрибутов см. ниже. | ||
+ | * start_routine IN Указатель на функцию потока. Выполнение потока состоит в выполнении этой функции. | ||
+ | * arg IN/OUT Указатель, | ||
+ | |||
+ | == Атрибуты == | ||
+ | Объект задающий атрибуты потока имеет тип pthread_attr_t. Такой объект должен быть инициализирован с помощью функции | ||
+ | |||
+ | * int pthread_attr_init(pthread_attr_t *attr); | ||
+ | |||
+ | В результате объект будет содержать набор свойств потока по умолчанию для данной реализации потоков. А ресурсы, | ||
+ | системе для хранения этих атрибутов освобождаются вызовом функции (после того, как объект был использован в вызове pthread_create и больше не нужен) | ||
+ | |||
+ | * int pthread_attr_destroy(pthread_attr_t *attr); | ||
+ | |||
+ | == Присоединение и отрыв == | ||
+ | |||
+ | Поток может быть " | ||
+ | |||
+ | * int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); | ||
+ | где detachstate можно установить в PTHREAD_CREATE_JOINABLE или в PTHREAD_CREATE_DETACHED соответственно. | ||
+ | Присоединяемые и оторванные потоки | ||
+ | |||
+ | Для каждого присоединяемого потока, | ||
+ | |||
+ | * int pthread_join(pthread_t thread, void **value_ptr); | ||
+ | Поток, вызвавший эту функцию, | ||
+ | |||
+ | == Взаимное исключение потоков == | ||
+ | Для организации взаимного исключения потоков при доступе к разделяемым данным используются мьютексы (mutex = mutual exclusion), объекты типа pthread_mutex_t. Мьютекс должен быть инициализирован перед использованием с помощью функкции | ||
+ | |||
+ | * int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); | ||
+ | * Параметр attr (IN) задает атрибуты мьютекса. Можно передать NULL для принятия атрибутов по умолчанию. Ресурсы, | ||
+ | |||
+ | * int pthread_mutex_destroy(pthread_mutex_t *mutex); | ||
+ | Для захвата мьютекса поток использует (см. пример) функцию | ||
+ | |||
+ | * int pthread_mutex_lock(pthread_mutex_t *mutex); | ||
+ | а для освобождения | ||
+ | |||
+ | * int pthread_mutex_unlock(pthread_mutex_t *mutex); | ||
+ | |||
+ | == Условные переменные == | ||
+ | |||
+ | Поясним использование условных переменных на примере. Например, | ||
+ | |||
+ | * ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ | ||
+ | |||
+ | < | ||
+ | pthread_mutex_t mutex; | ||
+ | // | ||
+ | pthread_cond_t cond; | ||
+ | // | ||
+ | int counter = 0; | ||
+ | </ | ||
+ | |||
+ | * ПОТОК НОМЕР 1 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | pthread_mutex_lock(& | ||
+ | //если значение не равно критическому | ||
+ | if(counter!=criticalValue) | ||
+ | // | ||
+ | //При этом мьютекс будет разблокирован. Как только событие наступит, | ||
+ | //и мьютекс будет отпущен вторым потоком, | ||
+ | // | ||
+ | pthread_cond_wait(& | ||
+ | // | ||
+ | processCriticalValue(); | ||
+ | // | ||
+ | pthread_mutex_unlock(); | ||
+ | </ | ||
+ | |||
+ | * ПОТОК НОМЕР 2 | ||
+ | |||
+ | < | ||
+ | do | ||
+ | { | ||
+ | ... | ||
+ | // | ||
+ | pthread_mutex_lock(& | ||
+ | // | ||
+ | doSomethingWith(& | ||
+ | //если событие наступило | ||
+ | if(counter==criticalValue) | ||
+ | // | ||
+ | pthread_cond_signal(& | ||
+ | // | ||
+ | pthread_mutex_unlock(& | ||
+ | ... | ||
+ | }while(...); | ||
+ | </ | ||
+ | |||
+ | Условная переменная должна быть инициализирована функцией | ||
+ | |||
+ | * int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); | ||
+ | А ресурсы, | ||
+ | |||
+ | * int pthread_cond_destroy(pthread_cond_t *cond); | ||
| |
etc/teach/parallel/threads.1193640393.txt.gz · Last modified: 2008/01/03 02:32 (external edit)