Взаимные исключения Posix
Взаимные исключения Posix
В листинге А.19 приведены глобальные переменные и функция main пpoгрaммы, измеряющей быстродействие взаимных исключений Posix.
Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix
//bench/incr_pxmutex1.с
1 #include "unpipc.h"
2 #define MAXNTHREADS 100
3 int nloop;
4 struct {
5 pthread_mutex_t mutex;
6 long counter;
7 } shared = {
8 PTHREAD_MUTEX_INITIALIZER
9 };
10 void *incr(void *);
11 int
12 main(int argc, char **argv)
13 {
14 int i, nthreads;
15 pthread_t tid[MAXNTHREADS];
16 if (argc != 3)
17 err_quit("usage: incr_pxmutex1 <#loops> <#threads>");
18 nloop = atoi(argv[1]);
19 nthreads = min(atoi(argv[2]), MAXNTHREADS);
20 /* блокировка взаимного исключения */
21 Pthread_mutex_lock(&shared.mutex);
22 /* создание потоков */
23 Set_concurrency(nthreads);
24 for (i = 0; i < nthreads; i++) {
25 Pthread_create(&tid[i], NULL, incr, NULL);
26 }
27 /* запуск таймера и разблокирование взаимного исключения */
28 Start_time();
29 Pthread_mutex_unlock(&shared.mutex);
30 /* ожидание завершения работы потоков */
31 for (i = 0; i < nthreads; i++) {
32 Pthread_join(tid[i], NULL);
33 }
34 printf("microseconds: %.0f usec ", Stop_time());
35 if (shared.counter != nloop * nthreads)
36 printf("error: counter = %ld ", shared, counter);
37 exit(0);
38 }
Общие данные
4-9 Совместно используемые потоками данные состоят из взаимного исключения и счетчика. Взаимное исключение инициализируется статически.
Блокирование взаимного исключения и создание потоков
20-26 Основной поток блокирует взаимное исключение перед созданием прочих потоков, чтобы ни один из них не получил это исключение до тех пор, пока все они не будут созданы. Вызывается функция set_concurrency, создаются потоки. Каждый поток выполняет функцию incr, текст которой будет приведен позже.
Запуск таймера и разблокирование взаимного исключения
27-36 После создания всех потоков главный поток запускает таймер и освобождает взаимное исключение. Затем он ожидает завершения всех потоков, после чего останавливает таймер и выводит полное время работы. В листинге А.20 приведен текст функции incr, выполняемой каждым из потоков.
Листинг А.20. Функция incr, выполняемая потоками
//bench/incr_pxmutex1.c
39 void *
40 incr(void *arg)
41 {
42 int i;
43 for (i = 0; i < nloop; i++) {
44 Pthread_mutex_lock(&shared.mutex);
45 shared.counter++;
46 Pthread_mutex_unlock(&shared.mutex);
47 }
48 return(NULL);
49 }
Увеличение счетчика — критическая область кода
44-46 Операция увеличения счетчика осуществляется после получения блокировки на взаимное исключение. После этого взаимное исключение разблокируется.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
10.6. Сигналы POSIX
10.6. Сигналы POSIX API POSIX основан на API sigvec() из BSD 4.2 и 4.3. С небольшими изменениями этот API можно было отнести к возможностям API как V7, так и System V Release 3. POSIX сделал эти изменения и переименовал API sigaction(). Поскольку интерфейс sigvec() широко не использовался, мы не будем его описывать.
API, POSIX и библиотека С
API, POSIX и библиотека С Обычно прикладные программы не разрабатываются с непосредственным использованием системных вызовов, при этом используются программные интерфейсы приложений (Application Programing Interface, API). Это является важным, так как в таком случае нет необходимости в
POSIX (BSD) API
POSIX (BSD) API Эта часть API наиболее полно соответствует API ОС UNIX, относящихся к ветви BSD (BSD, FreeBSD, NetBSD и другие).[5] Ее наименование можно было бы сузить до «BSD API», так как описанный далее набор API System V также регламентируется POSIX, но мы будем использовать именно термин «POSIX API», следуя
Отличия от POSIX
Отличия от POSIX Если следовать POSIX-стандарту, то некоторые из атрибутов невозможно переопределить до фактического создания этого стандарта (их можно изменить позже в самом коде потока, но иногда это не совсем правильное решение). Все эти возможности относятся к
6.2. Интерфейсы POSIX
6.2. Интерфейсы POSIX 6.2.1. Обязательные типы POSIX POSIX описывает некоторые определения типов в заголовочном файле <sys/types.h>, которые используются для многих аргументов и возвращаемых значений. Эти определения типов важны, потому что стандартные типы языка С могут быть разными
IEEE и POSIX
IEEE и POSIX В 1980 году была создана инициативная группа под названием /usr/group с целью стандартизации программного интерфейса UNIX, т. е. формального определения услуг, предоставляемых операционной системой приложениям. Решение этой задачи упростило бы переносимость приложений
История POSIX
История POSIX Слово «POSIX» представляет собой сокращение от «Portable Operating System Interface» (интерфейс переносимой операционной системы). POSIX — целое семейство стандартов, разрабатываемых организацией IEEE (Institute of Electrical and Electronics Engineers — Институт инженеров по электротехнике и
26.7. Взаимные исключения
26.7. Взаимные исключения Обратите внимание на то, что в листинге 26.8 при завершении выполнения очередного потока в главном цикле уменьшаются на единицу и nconn, и nlefttoread. Мы могли бы поместить оба эти оператора уменьшения в одну функцию do_get_read, что позволило бы каждому потоку
Posix
Posix Название Posix образовано от «Portable Operating System Interface», что означает приблизительно «интерфейс переносимых операционных систем». Это не один стандарт, а целое семейство, разработанное Институтом инженеров по электротехнике и радиоэлектронике (Institute for Electrical and Electronics Engineers
ГЛАВА 2 Posix IPC
ГЛАВА 2 Posix IPC 2.1. Введение Из имеющихся типов IPC следующие три могут быть отнесены к Posix IPC, то есть к методам взаимодействия процессов, соответствующим стандарту Posix:? очереди сообщений Posix (глава 5);? семафоры Posix (глава 10);? разделяемая память Posix (глава 13).Эти три вида IPC
ГЛАВА 7 Взаимные исключения и условные переменные
ГЛАВА 7 Взаимные исключения и условные переменные 7.1. Введение Эта глава начинается с обсуждения синхронизации — принципов синхронизации действий нескольких программных потоков или процессов. Обычно это требуется для предоставления нескольким потокам или процессам
7.2. Взаимные исключения: установка и снятие блокировки
7.2. Взаимные исключения: установка и снятие блокировки Взаимное исключение (mutex) является простейшей формой синхронизации. Оно используется для защиты критической области (critical region), предотвращая одновременное выполнение участка кода несколькими потоками (если взаимное
Взаимные исключения Posix между процессами
Взаимные исключения Posix между процессами Функция main первой программы использует взаимное исключение Posix для обеспечения синхронизации. Текст ее приведен в листинге А.32.Листинг А.32. Функция main для измерения быстродействия взаимных исключений между
7.19. Взаимные преобразования объектов Date, Time и DateTime
7.19. Взаимные преобразования объектов Date, Time и DateTime В Ruby есть три основных класса для работы с датами и временем: Time, Date и DateTime. Опишем их особенности:• Класс Time преимущественно обертывает соответствующие функции из стандартной библиотеки языка С. Они, как правило,
POSIX
POSIX В Linux и UNIX самый простой путь установления переменных окружения - добавить их определения в общесистемный профиль значений по умолчанию.Пользователь root также может:* выдать команды setenv() из командной строки wu командного скрипта;* для временного использования
POSIX
POSIX Linux, UNIX и другие платформы POSIX более предпочтительны, чем Windows, если требуется высокая безопасность. Технологии безопасности этих платформ являются продуманными и очень понятными в реализации. Безопасность файловой системы и надежный доступ присущи требованиям