- •О.А. Кононов
- •Реферат
- •Содержание
- •1 Стуктурная организациЯ осрв qnx
- •1.1 Архитектура микроядра системы qnx
- •1.1.1 Настоящее ядро
- •1.1.2 Системные процессы
- •1.2 Микроядро
- •1.3 Системные и пользовательские процессы
- •1.4 Драйверы устройств
- •1.5 Связь между процессами (ipc)
- •Передача сообщений
- •1.6 Qnx как сеть
- •2 Комплекс лабораторных работ
- •2.1 Лабораторная работа №1 «Простейший пример»
- •2.1.1 Теоретические сведения
- •2.1.2 Текст программы
- •2.2.2 Текст программы
- •2.2.3 Последовательность действий
- •2.2.4 Результаты
- •2.3 Лабораторная работа №3 «Обмен сообщениями»
- •2.3.1 Теоретические сведения
- •2.3.2 Текст программы
- •2.3.3 Последовательность действий
- •2.3.4 Результаты
- •2.4 Лабораторная работа №4 «Тайм - ауты»
- •2.4.1 Теоретические сведения
- •2.4.2 Текст программы
- •2.4.3 Последовательность действий
- •2.5.2 Текст программы
- •2.5.3 Последовательность действий
- •2.5.4 Результаты
- •2.6 Лабораторная работа №6 «Условные переменные»
- •2.6.1 Теоретические сведения
- •2.6.2 Текст программы
- •2.6.3 Последовательность действий
- •2.6.4 Результаты
- •Заключение
- •Список использованных источников
2.4.2 Текст программы
#include <stdio.h>
#include <pthread.h>
#include <inttypes.h>
#include <errno.h>
#include <sys/neutrino.h>
#define SEC_NSEC 1000000000LL // 1 sekynda billion nanosekynd
void * long_thread(void *notused)
{
printf("Etot potok vipolnaetsa bolee 10 sekynd \n");
sleep(20);
}
int main(void)
{
uint64_t timeout;
struct sigevent event;
int rval;
pthread_t thread_id;
printf("Prog timer \n");
event.sigev_notify = SIGEV_UNBLOCK;
//SIGEV_UNBLOCK_INIT(&event);
pthread_create(&thread_id, NULL, long_thread, NULL);
timeout = 10LL*SEC_NSEC;
TimerTimeout(CLOCK_REALTIME, _NTO_TIMEOUT_JOIN,&event, &timeout, NULL);
rval = pthread_join(thread_id, NULL);
if (rval == ETIMEDOUT)
{
printf ("istekli 10 sekynd, potok %d vipolniaetsia!\n", thread_id);
}
sleep(5);
TimerTimeout (CLOCK_REALTIME, _NTO_TIMEOUT_JOIN, &event, & timeout, NULL);
rval = pthread_join(thread_id, NULL);
if(rval == ETIMEDOUT)
{
printf("potok %d >25 sek!", rthread_id);
}
else
{
printf ("Potok %d zavershon kak nado \n", thread_id);
}
return(1);
2.4.3 Последовательность действий
Запустить программу на исполнение и сопоставлять то, что она выводит на экран с текстом программы.
2.4.4 Результаты
# cd ..
# cd lab2
# ls
. .. timer.c timer.exe
# `pwd`/timer.exe
Prog timer
Etot potok vipolnaetsa bolee 10 sekynd
istekli 10 sekynd, potok 2 vipolniaetsia!
Potok 2 zavershon kak nado
#
2.5 Лабораторная работа №5 «Барьеры»
2.5.1 Теоретические сведения
Применение барьера
Два метода синхронизации: один метод с применением функции pthreadJoin(), который мы только что рассмотрели, и метод с применением барьера.
Основной поток должен дождаться того момента, когда все рабочие потоки завершат работу, и только затем можно начинать следующую часть программы.
Однако, с применением функции pthreadJoin() мы ожидаем завершения потоков. Это означает, что на момент ее разблокирования потоков нет больше с нами; они закончили работу и завершились.
В случае с барьером, мы ждем «встречи» определенного числа потоков у барьера. Когда заданное число потоков достигнуто, мы их все разблокируем (заметьте, что потоки при этом продолжат выполнять свою работу).
Сначала барьер следует создать при помощи функции barrier_init0:
#include <sync.h>
int
barrier_init (barrier t *barrier,
const barrier attr t *attr,
int count) ;
Эта функция создает объект типа «барьер» по переданному ей адресу (указатель на барьер хранится в параметре barrier) и назначает ему атрибуты, которые определены в attr (мы будем использовать NULL, чтобы установить значения по умолчанию). Число потоков, которые должны вызывать функцию barrier_wait(), передается в параметре count.
После того как барьер создан, каждый из потоков должен будет вызвать функцию barrier_wait(), чтобы сообщить, что он отработал:
#include <sync.h>
int barrier_wait (barrier t *barrier) ;
После того как поток вызвал barrier_wait(), он будет блокирован до тех пор, пока число потоков, указанное первоначально в параметре count функции barrier_wait(), не вызовет функцию barrier_wait() (они также будут блокированы). После того как нужное число потоков выполнит вызов функции barrier_wait(), все эти потоки будут разблокированы «одновременно».