Чтение онлайн

на главную - закладки

Жанры

Параллельное и распределенное программирование на С++
Шрифт:

pthread_cond_wait (&l->rcond, &l->lock);

l->lock_count++;

/*

* Обратите внимание на то, что функция pthread_cleanup_pop

* выполняет здесь фyнкциюwaiting_reader_cleanup. */

pthread_cleanup_pop(l); }

void

release_read_lock (rwlock *1) {

pthread_mutex_lock (&l->lock); if (--l->lock_count == 0) pthread_cond_signal (&l->wcond); pthread_mutex_unlock (1);

void

waiting_writer_cleanup (void *arg) {

rwlock *1;

1 = (rwlock *) arg;

if ((—l->waiting_writers ==

О) && (l->lock_count >= 0)) { /*

* Это происходит только в случае отмены потока. */

pthread_cond_broadcast (&l->wcond);

}

pthread_mutex_unlock (&l->lock);

}

void

lock_for_write (rwlock *1) {

pthread_mutex_lock (&l->lock),-l->waiting_writers++;

pthread_cleanup_push (waiting_writer_cleanup, 1); while (l->lock_count ! = О) pthread_cond_wait (&l->wcond, &l->lock); l->lock_count = -1; /*

* Обратите внимание на то, что функция pthread_cleanup_pop

* выполняет здесь функцию waiting_writer_cleanup. */

pthread_cleanup_pop (1);

}

void

release_write_lock (rwlock *1) {

pthread_mutex_lock (&l->lock);

l->lock_count = 0;

if (l->waiting_writers == О)

pthread_cond_broadcast (&l->rcond)

else

pthread_cond_signal (&l->wcond); pthread_mutex_unlock (&l->lock);

}

/*

* Эта функция вызывается для инициализации блокировки

* чтения-записи. */

void

initialize_rwlock (rwlock *1) {

pthread_mutex_init (&l->lock, pthread_mutexattr_default); pthread_cond_init (&l->wcond, pthread_condattr_default); pthread_cond_init (&l->rcond, pthread_condattr_default); l->lock_count = О; l->waiting_writers = О;

\

Приложение Б 559

}

reader_thread {

lock_for_read (&lock);

pthread_cleanup_push (release_read_lock, &lock); /*

* Поток устанавливает блокировку для чтения. */

pthread_cleanup_pop (1);

}

writer_thread {

lock_for_write (&lock);

pthread_cleanup_push (release_write_lock, &lock); /*

* Поток устанавливает блокировку для записи. */

pthread_cleanup_pop (1) ;

}

Замечания по использованию

Две описываемые здесь функции, pthread_cleanup_push и pthread_cleanup_pop , которые помещают и извлекают из стека обработчики запроса на отмену потока, можно сравнить с левой и правой круглыми скобками. Их нужно всегда использовать «в паре».

Логическое обоснование

Ограничение, налагае м

ое на две функции, pthread_cleanup_push и pthread_cleanup_pop, которые помещают и извлекают из стека обработчики запроса на отмену потока, и состоящее в том, что они должны использоваться попарно в пределах одного и того же лексического контекста, позволяет создавать эффективные макросы (или компиляторные реализации) и эффективно управлять памятью. Вариант реализации этих функций в виде макросов может выглядеть следующим образом,

#define pthread_cleanup_push (rtn, arg) { \

struct _pthread_handler_rec _cleanup_handler, **_head; \

_cleanup_handler.rtn = rtn; \

_cleanup_handler.arg = arg; \

(void) pthread_getspecific (_pthread_handler_key, &_head);

\

_cleanup_handler.next = *_head; \

*_head = &_cleanup_handler;

#define pthread_cleanup_pop (ex) \

*_head = _cleanup_handler.next; \

if (ex) (*_cleanup_handler.rtn) (_cleanup_handler.arg); \

}

Возможна даже более «смелая» реализация этих функций, которая позволит компилятору «считать» обработчик запроса на отмену константой, значение которой можно «встраивать» в код. В данном томе стандарта IEEE Std 1003.1-2001 пока оставлен неопределенным результат вызова функции longjmp из обработчика сигнала, выполняемого в функции библиотеки POSIX System Interfaces. Если в какой-то реализации потребуется разрешить этот вызов и придать ему надлежащее поведение, функция longjmp должна в этом случае вызвать все обработчики запроса на отмену, которые были помещены в стек (но еще не извлечены из него) с момента вызова функции setjmp .

Рассмотрим многопоточную функцию, вызываемую одним потоком, который использует сигналы. Если бы сигнал был выдан обработчику сигналов во время операции qsort, и этому обработчику пришлось бы вызвать функцию longjmp (которая в свою очередь не вызывала бы обработчики запроса на отмену), то вспомогательные потоки, создаваемые функцией qsort , не были бы аннулированы. Они бы продолжали выполняться и осуществляли запись в массив аргументов даже в том случае, если этот массив был к тому времени извлечен из стека.

Обратите внимание на то, что такой механизм обработки запросов на отмену особенно тесно связан с языком С, и, несмотря на требование независимости языка, предъявляемое к любому унифицированному механизму выполнения «очистительно-восстановительных работ», подобный механизм, выраженный в других языках, может быть совершенно иным. Кроме того, необходимость этого механизма в действительности связана только с отсутствием реального механизма обработки исключительных ситуаций в языке С, который был бы идеальным решением.

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4