- •О.А. Кононов
- •Реферат
- •Содержание
- •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.5.2 Текст программы
#include <stdio.h>
#include <time.h>
#include <sync.h>
#include <sys/neutrino.h>
barrier_t barrier;
//int data_ready = 0;
//int inf = 0;
//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
void *thread1 (void * not_used)
{
time_t now;
char buf[27];
time(&now);
printf("Potok 1, vremia starta %s \n", ctime_r(&now,buf));
sleep(3);
barrier_wait(&barrier);
time(&now);
printf("barier v potoke 1 , vremia srabativania %s \n", ctime_r(&now,buf));
}
void *thread2 (void * not_used)
{
time_t now;
char buf[27];
time(&now);
printf("Potok 2, vremia starta %s \n", ctime_r(&now,buf));
sleep(6);
barrier_wait(&barrier);
time(&now);
printf("barier v potoke 2 , vremia srabativania %s \n", ctime_r(&now,buf));
}
main()
{
time_t now;
char buf[27];
barrier_init(&barrier, NULL, 3);
printf("Start \n");
pthread_create(NULL,NULL, thread1 ,NULL);
pthread_create(NULL,NULL, thread2 ,NULL);
time(&now);
printf(" Main(): oshidanie y bariera, vremia %s \n", ctime_r(&now,buf));
barrier_wait(&barrier);
time(&now);
printf("barier v main() , vremia srabativania %s \n", ctime_r(&now,buf));
sleep(5);
}
2.5.3 Последовательность действий
Основной поток создал объект типа «барьер» и инициализировал его значением счетчика, равным числу потоков (включая себя!), которые должны «встретиться» у барьера, прежде чем он «прорвется». В нашем примере этот индекс был равен 3 — один для потока main(), один для потока thread1() и один для потока thread2(). Затем, как и прежде, стартуют потоки вычисления графики (в нашем случае это потоки thread1() и thread2()). Для примера вместо приведения реальных алгоритмов графических вычислений мы просто временно «усыпили» потоки, указав в них sleep (20) и sleep (40), чтобы имитировать вычисления. Для осуществления синхронизации основной поток (таin()) просто блокирует сам себя на барьере, зная, что барьер будет разблокирован только после того, как рабочие потоки аналогично присоединятся к нему.
Как упоминалось ранее, с функцией pthreadJoin() рабочие потоки для синхронизации главного потока с ними должны умереть. В случае же с барьером потоки живут и чувствуют себя вполне хорошо. Фактически, отработав, они просто разблокируются по функции barrier_wait(). Тонкость здесь в том, что вы обязаны предусмотреть, что эти потоки должны делать дальше! В нашем примере с графикой мы не дали им никакого задания для них — просто потому что мы так придумали алгоритм. В реальной жизни вы могли бы захотеть, например, продолжить вычисления.
2.5.4 Результаты
# root/a.out
Start
Potok 1, vremia starta Tue Oct 21 00:29:01 2003
Potok 2, vremia starta Tue Oct 21 00:29:01 2003
Main(): oshidanie y bariera, vremia Tue Oct 21 00:29:01 2003
barier v potoke 2 , vremia srabativania Tue Oct 21 00:29:07 2003
barier v main() , vremia srabativania Tue Oct 21 00:29:07 2003
barier v potoke 1 , vremia srabativania Tue Oct 21 00:29:07 2003
#/**
2.6 Лабораторная работа №6 «Условные переменные»
2.6.1 Теоретические сведения
Условные переменные
Условные переменные (или «condvars») очень похожи на ждущие блокировки, которые мы рассматривали выше. В действительности, ждущие блокировки — это надстройка над механизмом условных переменных, и именно поэтому в таблице, иллюстрировавшей использование ждущих блокировок, у нас встречалось состояние CONDVAR. Функция pthread_cond_wait() точно так же освобождает мутекс, ждет, а затем повторно блокирует мутекс, аналогично функции pthread_sleepon_wait().