Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

18 #endif

19 return(shared); /* ошибка отображения в память */

20 }

Если система поддерживает флаг MAP_ANON (раздел 12.4), мы используем этот тип разделяемой памяти. В противном случае используется отображение в память файла /dev/zero (раздел 12.5).

Последующие изменения зависят от средства синхронизации и от того, что происходит с лежащим в основе этого средства типом данных при вызове fork. Детали описаны в разделе 10.12.

■ Взаимное исключение Posix: должно храниться в разделяемой памяти (вместе со счетчиком) и инициализироваться с установленным атрибутом PTHREAD_ PROCESS_SHARED. Код программы будет приведен ниже.

■ Блокировка чтения-записи Posix: должна храниться в разделяемой памяти (вместе со счетчиком) и инициализироваться с установленным атрибутом PTHREAD_PROCESS_SHARED.

■ Семафоры Posix, размещаемые в памяти: семафор должен храниться в разделяемой памяти (вместе со счетчиком), и вторым аргументом при вызове sem_init должна быть единица (указывающая на то, что семафор используется несколькими процессами).

■ Именованные семафоры Posix: следует либо вызывать sem_open из родительского и дочерних процессов по отдельности, либо вызывать sem_open в родительском процессе, учитывая, что семафор станет общим после вызова fork.

■ Семафоры System V: никакого специального кодирования не требуется, поскольку эти семафоры всегда могут использоваться как процессами, так и потоками. Дочерним процессам достаточно знать идентификатор семафора.

■ Блокировка записей fcntl: изначально предназначена для использования несколькими процессами.

Мы приведем код только для программы с взаимными исключениями 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);

  • Читать дальше
  • 1
  • ...
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: