- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Параллельное и распределенное программирование на С++ - Хьюз Камерон
Шрифт:
Интервал:
Закладка:
Issue 6
Функции pthread_attr_getschedpolicy() и pthread_attr_setschedpolicy () от м ечены как часть опций Threads и Thread Execution Scheduling.
Условие ошибки [ENOSYS] было удалено, поскольку в заглушках нет необходимости, если реализация не поддерживает опцию Thread Execution Scheduling.
В целях согласования со стандарто м IEEE Std 1003.1d-1999 была добавлена стратегия планирования SCHED_SPORADIC.
В целях согласования со стандарто м ISO/IEC 9899: 1999 в прототип функции pthread_attr_getschedpolicy () было добавлено ключевое слово restrict.
pthread_cancel
Имя
pthread_cancel — функция от м ены выполнения потока.
Синопсис
THR #include <pthread.h>
int pthread_cancel (pthread_t thread);
Описание
Функция pthread_cancel () создает запрос на отмену потока. Когда именно отмена вступит в силу, зависит от текущего состояния потока, заданного параметром thread, и его типа. При от м ене потока должны быть вызваны обработчики, выполняющие подготовительные действия, связанные с отменой потока. По завершении последнего обработчика должны быть вызваны деструкторы объектных данных, используемых отменяемым потоком. По завершении последнего деструктора поток, заданный пара м етро м thread, должен завершиться.
Действия, связанные с от м еной заданного потока, выполняются асинхронно по отношению к потоку, вызывающему функцию pthread_cancel ().
Возвращаемое значение
При успешном завершении функция pthread_cancel () возвращает нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Ошибки
Функция pthread_cancel () м ожет завершиться неудачно, если:
[ESRCH] не удалось найти поток, иде н тификационный но м ер (ID) которого соответствовал бы заданно м у.
Функция pthread_cancel () не возвра щ ает код ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
Отсутствуют.
Логическое обоснование
Для отправки потоку уведо м ления об от м ене расс м атривалось два альтернативных варианта. Для одного предполагалось определить новый сигнал SIGCANCEL с соответствующей семантикой отмены, а для другого— новую функцию pthread_cancel (), которая бы приводила в действие процедуру отмены потока.
Преимущество варианта, прелусматривающего создание нового сигнала, состояло в том, что критерии его выдачи были бы во многом идентичны тем, которые использовались при попытке выдать любой другой сигнал, поэтому сигнальный механизм уведомления об отмене казался унифицированным. И в самом деле, во многих реализациях отмена потоков осуществляется посредством специального сигнала. Однако до сих пор не существовало ни одной сигнальной функции (за исключением функции pthread_kill()), которую можно было бы использовать совместно с этим новым сигналом, поскольку поведение выдаваемого сигнала отмены должно было отличаться от поведения любого из уже определенных сигналов.
К достоинству варианта создания специальной функции можно отнести осознание того, что уведомление об отмене потока было бы в этом случае четко определенным. Кроме того, механизм выдачи уведомления об отмене не требует реализации в виде сигнала. Ведь если такой механизм заметно ближе к сигналам, то ему свойственны аналогии с языковым механизмом исключительных ситуаций, которые потенциально не видны.
В конечном счете, поскольку необходимость обеспечивать обработку большого числа исключительных ситуаций при использовании нового сигнала с существующими сигнальными функциями может неоправданно усложнить (даже запутать) процесс отмены потока, было решено сделать выбор в пользу специальной функции, которая устраняет эту проблему. Такая функция была тщательно разработана, причем так, что любая реализация могла бы обеспечить «безоговорочное» выполнение процедуры отмены «поверх» каких бы то ни было сигналов. Наличие специальной функции отмены потока также означает, что реализации не обязаны обеспечивать процедуру отмены с помощью сигналов.
Будущие направления
Отсутствуют.
Смотри также
pthread_exit (), pthread_cond_timedwait (), pthread_join (), pthread_setcancelstate (), то м Base D e finitions стандарта IEEE Std 1003.1-2001, <pthread.h>.
Последовательность внесения изменений
Функция впервые реализована в выпуске Issue 5. Включена для согласования с расширение м POSIX Threads Ext e nsion.
Issue 6
Функция pthread_cancel () от м ечена как часть опции Thr e ads.
pthread_cleanup_pop, pthread_cleanup_push
Имя
pthread_cleanup_pop, pthread_cleanup_push— функции создания обработчиков запроса об от м ене потоков.
Синопсис
THR
#include <pthread.h>
void pthread_cleanup_pop (int execute);
void pthread_cleanup_push (void (* routine) (void*),void *arg);
Описание
Функция pthread_cleanup_pop () используется для извлечения функции, расположенной в вершине стека вызываю щ его потока, предназначенного дл я выполнения подготовительных действий по аннулированию потока, и ее вызова (если пара м етр execute не равен нулю).
Функция pthread_cleanup_push() позволяет поместить в стек вызывающего потока заданную функцию обработчика routine, предназначенного для выполнения подготовительных действий по аннулированию потока. Этот обработчик будет извлечен из соответствующего стека и вызван с аргументом arg при наличии следующих условий:
• поток существует (т.е. он вызывает функцию pthread_exit ());
• поток действует в соответствии с запросом отмены;
• поток вызывает функцию pthread_cleanup_pop() с ненулевым значением аргумента execute.
Эти функции можно реализовать как макросы. Приложение должно гарантировать, что они имеют форму инструкций и используются попарно в пределах одного и того же лексического контекста (чтобы макрос pthread_cleanup_push () раскрывался в список лексем, начинающийся лексемой '{', а макрос pthread_cleanup_pop() раскрывался в список лексем, завершающийся соответствующей лексемой '}').
Результат вызова функции longjmp() или siglongjmp() не определен, ec-ли имели место обращения к функции pthread_cleanup_push() или pthread_cleanup_pop() без соответствующего «парного» вызова по причине заполнения буфера переходов. Результат вызова функции longjmp () или siglongjmp() из обработчика, предназначенного для выполнения подготовительных действий по аннулированию потока, также не определен.
Возвращаемые значения
Функции pthread_cleanup_push() и hread_cleanup_pop() не возвра щ ают никакого значения.
Ошибки
Ошибки не определены.
Эти функции не возвращают код ошибки [EINTR].
Примеры
Следующий код представляет собой пример использования примитивов потока для реализации блокировки чтения-записи (с приоритетом для записи) с возможностью отмены.
typedef struct {
pthread_mutex_t lock; pthread_cond_t rcond, wcond;
int lock_count;
/* lock_count < 0 .. Удерживается записывающим потоком. */ /* lock_count > 0 .. Удерживается lock_count считывающими * потоками. */
/* lock_count = 0 .. Ничем не удерживается. */ int waiting_writers; /* Счетчик ожидающих записывающих
* потоков. */
} rwlock;
void
waiting_reader_cleanup (void, *arg) {
rwlock *1;
1 = (rwlock *) arg;
pthread_mutex_unlock (&l->lock);
}
void
lock_for_read (rwlock *1) {
pthread_mutex_lock (&l->lock);
pthread_cleanup_push (waiting_reader_cleanup, 1) ;