Взаимные исключения Posix между процессами

Взаимные исключения Posix между процессами

Функция main первой программы использует взаимное исключение Posix для обеспечения синхронизации. Текст ее приведен в листинге А.32.

Листинг А.32. Функция main для измерения быстродействия взаимных исключений между процессами

//bench/incr_pmutex5.с

1  #include "unpipc.h"

2  #define MAXNPROC 100

3  int nloop;

4  struct shared {

5   pthread_mutex_t mutex;

6   long counter;

7  } *shared; /* указатель, сама структура в общей памяти */

8  void *incr(void *);

9  int

10 main(int argc, char **argv)

11 {

12  int i, nprocs;

13  pid_t childpid[MAXNPROC];

14  pthread_mutexattr_t mattr;

15  if (argc != 3)

16   err_quit("usage: incr_pxmutex5 <#loops> <#processes>");

17  nloop = atoi(argv[l]);

18  nprocs = min(atoi(argv[2]), MAXNPROC);

19  /* получение разделяемой памяти для родительского и дочерних процессов */

20  shared = My_shm(sizeof(struct shared));

21  /* инициализация взаимного исключения и его блокировка */

22  Pthread_mutexattr_init(&mattr);

23  Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

24  Pthread_mutex_init(&shared->mutex, &mattr);

25  Pthread_mutexattr_destroy(&mattr);

26  Pthread_mutex_lock(&shared->mutex);

27  /* порождение дочерних процессов */

28  for (i = 0; i < nprocs; i++) {

29   if ((childpid[i] = Fork()) == 0) {

30    incr(NULL);

31    exit(0);

32   }

33  }

34  /* родительский процесс: запуск таймера и разблокирование взаимного исключения */

35  Start_time();

36  Pthread_mutex_unlock(&shared->mutex);

37  /* ожидание завершения всех дочерних процессов */

38  for (i = 0; i < nprocs; i++) {

39   Waitpid(childpid[i], NULL, 0);

40  }

41  printf("microseconds: %.0f usec ", Stop_time());

42  if (shared->counter != nloop * nprocs)

43   printf("error: counter = %ld ", shared->counter);

44  exit(0);

45 }

19-20 Поскольку мы запускаем несколько процессов, структура shared должна располагаться в разделяемой памяти. Мы вызываем функцию my_shm, текст которой приведен в листинге А.31.

21-26 Поскольку взаимное исключение помещено в разделяемую память, мы не можем статически инициализировать его, поэтому мы вызываем pthread_mutex_init после установки атрибута PTHREAD_PROCESS_SHARED. Взаимное исключение блокируется.

27-36 После создания дочерних процессов и запуска таймера блокировка снимается.

37-43 Родительский процесс ожидает завершения всех дочерних, после чего останавливает таймер.

Листинг А.33. Увеличение счетчика с использованием взаимных исключений между процессами

//bench/incr_pxmutex5.с

46 void *

47 incr(void *arg)

48 {

49  int i;

50  for (i = 0; i < nloop; i++) {

51   Pthread_mutex_lock(&shared->mutex);

52   shared->counter++;

53   Pthread_mutex_unlock(&shared->mutex);

54  }

55  return(NULL);

56 }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Управление процессами

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Управление процессами Время — это средство, с помощью которого Природа не дает всему происходить сразу. В компьютерах таким средством служат процессы. Процесс — это исполняющаяся программа. Он состоит из исполняемой программы, данных программы и некоторой информации


ГЛАВА 7 Взаимные исключения и условные переменные

Из книги Системное программирование в среде Windows автора Харт Джонсон М

ГЛАВА 7 Взаимные исключения и условные переменные 7.1. Введение Эта глава начинается с обсуждения синхронизации — принципов синхронизации действий нескольких программных потоков или процессов. Обычно это требуется для предоставления нескольким потокам или процессам


7.2. Взаимные исключения: установка и снятие блокировки

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

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


Взаимные исключения Posix

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Взаимные исключения Posix В листинге А.19 приведены глобальные переменные и функция main пpoгрaммы, измеряющей быстродействие взаимных исключений Posix.Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix//bench/incr_pxmutex1.с1  #include "unpipc.h"2  #define MAXNTHREADS 1003  int


ГЛАВА 11 Взаимодействие между процессами

Из книги Операционная система UNIX автора Робачевский Андрей М.

ГЛАВА 11 Взаимодействие между процессами В главе 6 было показано, как создавать процессы и управлять ими, тогда как главы 7—10 были посвящены описанию методов управления потоками, которые выполняются внутри процессов, и объектов, обеспечивающих их синхронизацию. Вместе с


7.19. Взаимные преобразования объектов Date, Time и DateTime

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

7.19. Взаимные преобразования объектов Date, Time и DateTime В Ruby есть три основных класса для работы с датами и временем: Time, Date и DateTime. Опишем их особенности:• Класс Time преимущественно обертывает соответствующие функции из стандартной библиотеки языка С. Они, как правило,


14.1.3. Манипулирование процессами

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

14.1.3. Манипулирование процессами В этом разделе мы обсудим манипулирование процессами, хотя создание нового процесса необязательно связано с запуском внешней программы. Основной способ создания нового процесса — это метод fork, название которого в соответствии с


3.1. Знакомство с процессами

Из книги автора

3.1. Знакомство с процессами Пользователю достаточно войти в систему, чтобы в ней начали выполняться процессы. Даже если пользователь ничего не запускает, а просто сидит перед экраном и пьет кофе. в системе все равно "теплится жизнь". Любой выполняющейся программе


Взаимодействие между процессами

Из книги автора

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


26.7. Взаимные исключения

Из книги автора

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


Распределение клиентских соединений между дочерними процессами

Из книги автора

Распределение клиентских соединений между дочерними процессами Следующей темой обсуждения является распределение клиентских соединений между свободными дочерними процессами, блокированными в вызове функции accept. Для получения этой информации мы модифицируем функцию


Распределение клиентских соединений между дочерними процессами

Из книги автора

Распределение клиентских соединений между дочерними процессами Используя функцию, показанную в листинге 30.10, мы можем исследовать распределение клиентских запросов между свободными дочерними процессами. Результат показан в табл. 30.2. Операционная система распределяет