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

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

Шрифт:

40 }

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

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

43 printf("error: counter = %ld\n", 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 }

ПРИЛОЖЕНИЕ Б

Основы многопоточного программирования

Б.1. Введение

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

Хотя эта парадигма хорошо работала на протяжении многих лет, вызов fork обладает некоторыми недостатками:

■ вызов fork ресурсоемок. Память копируется от родительского процесса к дочернему, копируются все дескрипторы и т. д. Существующие реализации используют метод копирования при записи (copy-on-write), что исключает необходимость копирования адресного пространства родительского процесса, пока оно не понадобится клиенту, но, несмотря на эту оптимизацию, вызов fork остается ресурсоемким;

■ для передачи информации между родительским и дочерним процессами необходимо использовать одну из форм IPC после вызова fork. Передать информацию дочернему процессу легко: это можно сделать до вызова fork. Однако передать ее обратно может быть достаточно сложно.

Потоки помогают решить обе проблемы. Часто они называются «облегченными процессами» (lightweight processes), поскольку поток проще, чем процесс. Создание потока может занимать по времени меньше одной десятой создания процесса.

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

■ инструкции процесса;

■ большую часть данных;

■ открытые файлы (дескрипторы);

■ обработчики сигналов и вообще настройки для работы с сигналами;

■ текущий рабочий каталог;

■ идентификатор пользователя и группы.

Однако каждый поток имеет свои собственный:

■ идентификатор потока;

■ набор регистров, включая PC и указатель стека;

■ стек (для локальных переменных и адресов возврата);

■ errno;

■ маску сигналов;

■ приоритет.

Б.2. Основные функции для работы с потоками: создание и завершение

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

Функция pthread_create

При запуске пpoгрaммы вызовом exec создается единственный поток, называемый начальным потоком, или главным (initial thread). Добавочные потоки создаются вызовом pthread_create:

#include <pthread.h>

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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