Семафоры Posix, размещаемые в памяти
Семафоры Posix, размещаемые в памяти
Мы измеряем скорость работы семафоров Posix (именованных и размещаемых в памяти). В листинге А.24 приведен текст функции main, а в листинге А.23 — текст функции incr.
Листинг А.23. Увеличение счетчика с использованием семафоров Posix в памяти
//bench/incr_pxsem1.с
37 void *
38 incr(void *arg)
39 {
40 int i;
41 for (i = 0; i < nloop; i++) {
42 Sem_wait(&shared.mutex);
43 shared.counter++;
44 Sem_post(&shared.mutex);
45 }
46 return(NULL);
47 }
Листинг А.24. Функция main для семафоров Posix, размещаемых в памяти
//bench/incr_pxsem1.с
1 #include "unpipc.h"
2 #define MAXNTHREADS 100
3 int nloop;
4 struct {
5 sem_t mutex; /* размещаемый в памяти семафор */
6 long counter;
7 } shared;
8 void *incr(void *);
9 int
10 main(int argc, char **argv)
11 {
12 int i, nthreads;
13 pthread_t tid[MAXNTHREADS];
14 if (argc != 3)
15 err_quit("usage: incr_pxseml <#loops> <#threads>");
16 nloop = atoi(argv[1]);
17 nthreads = min(atoi(argv[2]), MAXNTHREADS);
18 /* инициализация размещаемого в памяти семафора 0 */
19 Sem_init(&shared.mutex, 0, 0);
20 /* создание всех потоков */
21 Set_concurrency(nthreads);
22 for (i = 0; i < nthreads; i++) {
23 Pthread_create(&tid[i], NULL, incr, NULL);
24 }
25 /* запуск таймера и разблокирование семафора */
26 Start_time();
27 Sem_post(&shared.mutex);
28 /* ожидание завершения всех потоков */
29 for (i = 0; i < nthreads; i++) {
30 Pthread_join(tid[i], NULL);
31 }
32 printf("microseconds: %.0f usec ", Stop_time());
33 if (shared.counter != nloop * nthreads)
34 printf("error: counter = %ld ", shared.counter);
35 exit(0);
36 }
18-19 Создается семафор, инициализируемый значением 0. Второй аргумент в вызове sem_init, имеющий значение 0, говорит о том, что семафор используется только потоками вызвавшего процесса.
20-27 После создания всех потоков запускается таймер и вызывается функция sem_post.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Семафоры
Семафоры Объекты второго из трех упомянутых в начале главы типов объектов синхронизации ядра — семафоры (semaphores), поддерживают счетчики, и когда значение этого счетчика больше 0, объект семафора находится в сигнальном состоянии. Если же значение счетчика становится
Семафоры
Семафоры В операционной системе Linux семафоры (semaphore) — это блокировки, которые переводят процессы в состояние ожидания. Когда задание пытается захватить семафор, который уже удерживается, семафор помещает это задание в очередь ожидания (wait queue) и переводит это задание в
Семафоры чтения-записи
Семафоры чтения-записи Семафоры, так же как и спин-блокировки, могут быть типа чтения-записи. Ситуации, в которых предпочтительнее использовать семафоры чтения-записи такие же как и в случае использования спин-блокировок чтения-записи.Семафоры чтения-записи
Семафоры
Семафоры Давайте переместимся из ванной комнаты на кухню, так как это социально адаптированное помещение для одновременного обитания более чем одного человека. На кухне вы можете не пожелать, чтобы все и каждый находились бы там одновременно. В действительности вы бы,
Семафоры
Семафоры Для синхронизации процессов, а точнее, для синхронизации доступа нескольких процессов к разделяемым ресурсам, используются семафоры. Являясь одной из форм IPC, семафоры не предназначены для обмена большими объемами данных, как в случае FIFO или очередей сообщений.
12.3 СЕМАФОРЫ
12.3 СЕМАФОРЫ Поддержка системы UNIX в многопроцессорной конфигурации может включать в себя разбиение ядра системы на критические участки, параллельное выполнение которых на нескольких процессорах не допускается. Такие системы предназначались для работы на машинах AT amp;T
26.6. Семафоры
26.6. Семафоры Семафор — это объект IPC, управляющий доступом к общим ресурсам (устройствам). Семафоры не позволяют одному процессу захватить устройство до тех пор, пока с этим устройством работает другой процесс. Семафор может находиться в двух положениях: 0 (устройство
10.13. Ограничения на семафоры
10.13. Ограничения на семафоры Стандартом Posix определены два ограничения на семафоры:? SEM_NSEMS_MAX — максимальное количество одновременно открытых семафоров для одного процесса (Posix требует, чтобы это значение было не менее 256);? SEM_VALUE_MAX — максимальное значение семафора (Posix
Именованные семафоры Posix
Именованные семафоры Posix В листинге А.26 приведен текст функции main, измеряющей быстродействие именованных семафоров Posix, а в листинге А.25 — соответствующая функция incr.Листинг А.25. Увеличение общего счетчика с использованием именованного семафора Posix//bench/incr_pxsem2.c40 void
Семафоры System V
Семафоры System V Функция main программы, измеряющей быстродействие семафоров System V, приведена в листинге А.27, а функция incr показана в листинге А.28.Листинг А.27. Функция main для измерения быстродействия семафоров System V//bench/incr_svsem1.c1 #include "unpipc.h"2 #define MAXNTHREADS 1003 int nloop;4 struct {5 int
4.4.2. Исключающие семафоры
4.4.2. Исключающие семафоры Решение проблемы гонки заключается в том, чтобы позволить только одному потоку обращаться к очереди в конкретный момент времени. Когда поток начинает просматривать очередь, все остальные потоки вынуждены дожидаться, пока он удалит очередное
4.4.5. Обычные потоковые семафоры
4.4.5. Обычные потоковые семафоры В предыдущем примере, в котором группа потоков обрабатывает задания из очереди, потоковая функция запрашивает задания до тех пор, пока очередь не опустеет, после чего поток завершается. Эта схема работает в том случае, когда все задания
5.2. Семафоры для процессов
5.2. Семафоры для процессов Как говорилось в предыдущем разделе, процессы должны координировать свои усилия при совместном доступе к памяти. Вспомните: в разделе 4.4.5, "Обычные потоковые семафоры", рассказывалось о семафорах, которые являются счетчиками, позволяющими
8.4. Динамически размещаемые объекты
8.4. Динамически размещаемые объекты Время жизни глобальных и локальных объектов четко определено. Программист неспособен хоть как-то изменить его. Однако иногда необходимо иметь объекты, временем жизни которых можно управлять. Выделение памяти под них и ее