etc:teach:parallel:threads
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| etc:teach:parallel:threads [2007/10/29 09:43] – создано 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.1193640202.txt.gz · Last modified: 2008/01/03 02:32 (external edit)