Пример: запуск нового потока
Пример: запуск нового потока
Альтернативой снятию блокировки сигналом является присваивание 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.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Запуск потока
Запуск потока Теперь, когда мы знаем, как запустить другой процесс, давайте рассмотрим, как осуществить запуск другого потока.Любой поток может создать другой поток в том же самом процессе; на это не налагается никаких ограничений (за исключением объема памяти, конечно!)
Запуск нового программного кода
Запуск нового программного кода Наконец, рассмотрим запуск на выполнение нового, отличного от родительского процесса программного кода, образ которого содержится в отдельном исполняемом файле в качестве дочернего процесса. Для этой цели в QNX существуют две группы
Создание нового потока
Создание нового потока Создание нового потока в программном коде осуществляет вызов: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)?Выполним ряд
Зона потока
Зона потока О сверхпроизводительном состоянии, называемом «потоком» (flow), написано много литературы. Некоторые программисты называют его «зоной». Как бы оно ни называлось, вероятно, вам знакомо это ощущение предельной концентрации сознания, в которое может войти
Создание потока
Создание потока Поток создается при первом открытии с помощью системного вызова специального файла устройства, ассоциированного с драйвером STREAMS. Как правило, процесс создает поток в два этапа: сначала создается элементарный поток, состоящий из нужного драйвера и
Запуск нового инфопродукта
Запуск нового инфопродукта Это тот случай, когда вы можете за 36 часов сделать продажи на сотни тысяч рублей и даже на миллион, как это делают многие наши ученики, да и мы сами. Раньше это казалось очень сложной задачей, а сейчас человек даже с небольшой подписной базой
Запуск нового инфопродукта в рассылке
Запуск нового инфопродукта в рассылке Скачайте эту интеллект-карту по адресу:
4.2. Отмена потока
4.2. Отмена потока Обычно поток завершается при выходе из потоковой функции или вследствие вызова функции pthread_exit(). Но существует возможность запросить из одного потока уничтожение другого. Это называется отменой, или принудительным завершением, потока.Чтобы отменить
20.7. Состояния потока
20.7. Состояния потока Пользователей библиотеки iostream, разумеется, интересует, находится ли поток в ошибочном состоянии. Например, если мы пишемint ival;cin ival;и вводим слово "Borges", то cin переводится в состояние ошибки после неудачной попытки присвоить строковый литерал целому
Пример 19-3. Запуск нескольких процессов в подоболочках
Пример 19-3. Запуск нескольких процессов в подоболочках (cat list1 list2 list3 | sort | uniq > list123) & (cat list4 list5 list6 | sort | uniq > list456) & # Слияние и сортировка двух списков производится одновременно. # Запуск в фоне гарантирует параллельное исполнение. # # Тот же эффект
Пример 20-1. Запуск сценария в ограниченном режиме
Пример 20-1. Запуск сценария в ограниченном режиме #!/bin/bash# Если sha-bang задать в таком виде: "#!/bin/bash -r"# то это приведет к включению ограниченного режима с момента запуска скрипта.echoecho "Смена каталога."cd /usr/localecho "Текущий каталог: `pwd`"echo "Переход в домашний каталог."cdecho "Текущий
8.4.2 Состояния Потока
8.4.2 Состояния Потока Каждый поток (istream или ostream) имеет ассоциированное с ним состояние, и обработка ошибок и нестандартных условий осуществляется с помощью соответствующей установки и проверки этого состояния.Поток может находиться в одном из следующих состояний:enum