Пример: запуск нового потока

Пример: запуск нового потока

Альтернативой снятию блокировки сигналом является присваивание sigev_notify значения SIGEV_THREAD, что приводит к созданию нового потока. Функция, указанная в sigev_notify_function, вызывается с параметром sigev_value. Атрибуты нового канала указываются переменной sigev_notify_attributes, которая может быть и нулевым указателем, если нас устраивают устанавливаемые по умолчанию атрибуты. Текст программы приведен в листинге 5.13.

Листинг 5.13. Функция mq_notify, запускающая новый программный поток

//pxmsg/mqnotifythread1.с

1  #include "unpipc.h"

2  mqd_t mqd;

3  struct mq_attr attr;

4  struct sigevent sigev;

5  static void notify_thread(union sigval); /* наш поток */

6  int

7  main(int argc, char **argv)

8  {

9   if (argc != 2)

10   err_quit("usage: mqnotifythread1 <name>");

11  mqd = Mq_open(argv[1], O_RDONLY | O_NONBLOCK);

12  Mq_getattr(mqd, &attr);

13  sigev.sigev_notify = SIGEV_THREAD;

14  sigev.sigev_value.sival_ptr = NULL;

15  sigev.sigev_notify_function = notify_thread;

16  sigev.sigev_notify_attributes = NULL;

17  Mq_notify(mqd, &sigev);

18  for (;;)

19   pause(); /* новый поток делает все */

20  exit(0);

21 }

22 static void

23 notify_thread(union sigval arg)

24 {

25  ssize_t n;

26  void *buff;

27  printf("notify_thread started ");

28  buff = Malloc(attr.mq_msgsize);

29  Mq_notify(mqd, &sigev); /* перерегистрируемся */

30  while ((n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) >= 0) {

31   printf("read %ld bytes ", (long) n);

32  }

33  if (errno != EAGAIN)

34   err_sys("mq_receive error");

35  free(buff);

36  pthread_exit(NULL);

37 }

Мы задаем нулевой указатель в качестве аргумента нового потока (sigev_value), поэтому функции start нового потока ничего не передается. Мы могли бы передать указатель на дескриптор, вместо того чтобы декларировать его как глобальный, но новому потоку все равно нужно получать атрибуты очереди сообщений и структуру sigev (для перерегистрации). Мы также указываем нулевой указатель в качестве атрибутов нового потока, поэтому используются установки по умолчанию. Новые потоки создаются как неприсоединенные (detached threads).

ПРИМЕЧАНИЕ

К сожалению, ни одна из использовавшихся для проверки примеров систем (Solaris 2.6 и Digital Unix 4.0B) не поддерживает SIGEV_THREAD. Обе они допускают только два значения sigev_notify: SIGEV_NONE и SIGEV_SIGNAL.

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

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

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

8.4.2 Состояния Потока

Из книги C++ автора Хилл Мюррей

8.4.2 Состояния Потока Каждый поток (istream или ostream) имеет ассоциированное с ним состояние, и обработка ошибок и нестандартных условий осуществляется с помощью соответствующей установки и проверки этого состояния.Поток может находиться в одном из следующих состояний:enum


Запуск нового программного кода

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

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


Создание нового потока

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Создание нового потока Создание нового потока в программном коде осуществляет вызов:int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void*(*start_routine)(void*), void* arg);где thread — NULL или указатель переменной типа pthread_t, значение которой будет загружено идентификатором созданного потока после


Атрибуты потока

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Атрибуты потока В коде реальных приложений очень часто можно видеть простейшую форму вызова, порождающего новый поток, в следующем виде:pthread_create(NULL, NULL, &thread_func, NULL);И для многих целей такого вызова достаточно, так как созданный поток будет обладать свойствами,


«Легковесность» потока

Из книги Инфобизнес за один день автора Ушанов Азамат

«Легковесность» потока Вот теперь, завершив краткий экскурс использования процессов и потоков, можно вернуться к вопросу, который вскользь уже звучал по ходу рассмотрения: почему и в каком смысле потоки часто называют «легкими процессами» (LWP — lightweight process)?Выполним ряд


Запуск потока

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

Запуск потока Теперь, когда мы знаем, как запустить другой процесс, давайте рассмотрим, как осуществить запуск другого потока.Любой поток может создать другой поток в том же самом процессе; на это не налагается никаких ограничений (за исключением объема памяти, конечно!)


Пример 19-3. Запуск нескольких процессов в подоболочках

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

Пример 19-3. Запуск нескольких процессов в подоболочках (cat list1 list2 list3 | sort | uniq > list123) & (cat list4 list5 list6 | sort | uniq > list456) & # Слияние и сортировка двух списков производится одновременно. # Запуск в фоне гарантирует параллельное исполнение. # # Тот же эффект


Пример 20-1. Запуск сценария в ограниченном режиме

Из книги C++ для начинающих автора Липпман Стенли

Пример 20-1. Запуск сценария в ограниченном режиме #!/bin/bash# Если sha-bang задать в таком виде: "#!/bin/bash -r"# то это приведет к включению ограниченного режима с момента запуска скрипта.echoecho "Смена каталога."cd /usr/localecho "Текущий каталог: `pwd`"echo "Переход в домашний каталог."cdecho "Текущий


Запуск нового инфопродукта

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

Запуск нового инфопродукта Это тот случай, когда вы можете за 36 часов сделать продажи на сотни тысяч рублей и даже на миллион, как это делают многие наши ученики, да и мы сами. Раньше это казалось очень сложной задачей, а сейчас человек даже с небольшой подписной базой


Запуск нового инфопродукта в рассылке

Из книги Идеальный программист. Как стать профессионалом разработки ПО автора Мартин Роберт С.

Запуск нового инфопродукта в рассылке Скачайте эту интеллект-карту по адресу:


4.2. Отмена потока

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

4.2. Отмена потока Обычно поток завершается при выходе из потоковой функции или вследствие вызова функции pthread_exit(). Но существует возможность запросить из одного потока уничтожение другого. Это называется отменой, или принудительным завершением, потока.Чтобы отменить


Создание потока

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

Создание потока Поток создается при первом открытии с помощью системного вызова специального файла устройства, ассоциированного с драйвером STREAMS. Как правило, процесс создает поток в два этапа: сначала создается элементарный поток, состоящий из нужного драйвера и


20.7. Состояния потока

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

20.7. Состояния потока Пользователей библиотеки iostream, разумеется, интересует, находится ли поток в ошибочном состоянии. Например, если мы пишемint ival;cin ival;и вводим слово "Borges", то cin переводится в состояние ошибки после неудачной попытки присвоить строковый литерал целому


Зона потока

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

Зона потока О сверхпроизводительном состоянии, называемом «потоком» (flow), написано много литературы. Некоторые программисты называют его «зоной». Как бы оно ни называлось, вероятно, вам знакомо это ощущение предельной концентрации сознания, в которое может войти