Читаем Linux API. Исчерпывающее руководство полностью

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

Большинство функций, описанных в стандарте SUSv3, должны быть потокобезопасными. Этот стандарт также ограничивает круг функций, на которые это требование не распространяется. Такие функции обычно используют статическое хранилище для возвращения информации вызывающему потоку или сохраняют данные между последовательными вызовами. По умолчанию они не являются реентерабельными, и для обеспечения их потоков безопасности нельзя применять мьютексы. Мы рассмотрели две примерно равнозначные методики, которые позволяют сделать функцию потокобезопасной, не изменяя при этом ее интерфейс — данные уровня потока и локальное хранилище потока. Оба этих подхода позволяют функции выделять в каждом потоке отдельное постоянное хранилище.


Дополнительная информация

Ознакомьтесь с источниками, приведенными в разделе 29.10.


31.6. Упражнения


31.1. Реализуйте функцию one_time_init(control, init), которая делает то же самое, что и вызов pthread_once(). Аргумент control должен быть указателем на статически выделенную структуру, содержащую булеву переменную и мьютекс. Булева переменная сигнализирует, вызывалась ли функция init ранее, а мьютекс защищает доступ к переменной. Чтобы не усложнять реализацию, вы можете игнорировать случаи, когда init() завершается неудачей или отменяется при первом вызове из потока (то есть в таких случаях вам не обязательно предусматривать механизм, благодаря которому следующий поток, вызывающий one_time_init(), делает повторную попытку вызова init()).

31.2. Напишите потокобезопасные версии функций dirname() и basename() (см. раздел 18.14) на основе данных уровня потока.

32. Потоки выполнения: отмена потока

Обычно разные потоки работают параллельно, выполняя свою задачу до тех пор, пока не решат завершиться с помощью вызова pthread_exit() или вернуться из своей начальной функции.

Но иногда возникает необходимость в отмене потока; это выглядит как передача потоку запроса с просьбой немедленно закончить работу. Это может пригодиться в ситуации, когда, например, группа потоков выполняет какие-то вычисления и один из них обнаруживает ошибку, из-за которой нужно завершить все остальные потоки. Или, к примеру, графическое приложение может иметь кнопку отмены, с помощью которой пользователь может завершить задачу, выполняемую потоком в фоновом режиме; в этом случае главный поток (который управляет графическим интерфейсом) должен попросить фоновый поток завершиться.

В этой главе мы рассмотрим механизм отмены POSIX-потоков.


32.1. Отмена потока


Функция pthread_cancel() отправляет заданному потоку thread запрос отмены.

#include


int pthread_cancel(pthread_t thread);

Возвращает 0 при успешном завершении или положительное число, если произошла ошибка

Выполнив запрос отмены, функция pthread_cancel() немедленно возвращается; то есть она не ждет завершения заданного потока.

Что именно происходит с заданным потоком и в какой момент, зависит от его состояния и типа отмены (о чем пойдет речь в следующем разделе).


32.2. Состояние и тип отмены


Функции pthread_setcancelstate() и pthread_setcanceltype() устанавливают флаги, которые позволяют управлять реакцией потока на запрос отмены.

#include


int pthread_setcancelstate(int state, int *oldstate);

int pthread_setcanceltype(int type, int *oldtype);

Обе функции возвращают 0 при успешном завершении или положительное число, если произошла ошибка

Функция pthread_setcancelstate() приводит состояние отмены вызывающего потока к одному из двух значений, поддерживаемых аргументом state.

• PTHREAD_CANCEL_DISABLE — поток нельзя отменить. Если получен запрос отмены, он откладывается до момента, когда возможность отмены будет включена.

• PTHREAD_CANCEL_ENABLE — поток можно отменить. Это состояние используется по умолчанию для создаваемых потоков.

Предыдущее состояние отмены возвращается по адресу, на который указывает аргумент oldstate.

Если нас не интересует предыдущее состояние отмены, Linux позволяет присвоить oldstate значение NULL. Это также относится ко многим другим системам; однако стандарт SUSv3 не предусматривает данной возможности, поэтому переносимые приложения не могут на нее полагаться. Для аргумента oldstate всегда нужно указывать ненулевое значение.

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

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных