Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплекс работ по QNX.doc
Скачиваний:
205
Добавлен:
30.04.2015
Размер:
382.46 Кб
Скачать

2.6.2 Текст программы

#include <stdio.h>

#include <pthread.h>

int data_ready = 0;

int inf = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;

void *consumer (void * notused)

{

printf("Eto potrebitel \n");

while(1)

{

pthread_mutex_lock (&mutex);

printf("W1 \n");

while (!data_ready)

{

printf("W2 \n");

pthread_cond_wait (&condvar, & mutex);

printf("W3 \n");

}

printf("dannie ot proizv = %d \n",inf);

data_ready=0;

pthread_cond_signal(&condvar);

pthread_mutex_unlock(&mutex);

}

}

void *producer (void * notused)

{

printf("Eto proizvoditel \n");

while(1)

{

sleep(2);

printf("proizvoditel polychil dannie ot h/w = %d \n",inf);

pthread_mutex_lock (&mutex);

printf("Wp1 \n");

while (data_ready)

{

printf("Wp2 \n");

pthread_cond_wait (&condvar, & mutex);

}

data_ready=1;

inf++;

printf("Wp3 \n");

pthread_cond_signal(&condvar);

pthread_mutex_unlock(&mutex);

}

}

main()

{

printf("Start \n");

pthread_create(NULL,NULL, consumer,NULL);

pthread_create(NULL,NULL, producer,NULL);

sleep(10);

}

2.6.3 Последовательность действий

Этот пример в значительной степени похож на программу с применением ждущей блокировки, с небольшими отличиями. Первое отличие, которое бросается в глаза, — здесь использован новый тип данных, pthread_cond__t. Это просто декларация для условной переменной; мы назвали нашу условную переменную condvar.

Следующее, что видно из примера, — это то, что структура «потребителя» идентична таковой в предыдущем примере со ждущей блокировкой.

Основное различие здесь состоит в том, что библиотека ждущих блокировок имеет скрытый внутренний мутекс, а при использовании условных переменных мутекс передается явно. Последний способ дает нам больше гибкости.

И, наконец, обратите внимание на то, что мы использовали функцию pthread_cond_signal() (опять же, с явной передачей мутекса).

2.6.4 Результаты

# root/a.out

Start

Eto potrebitel

W1

W2

Eto proizvoditel

proizvoditel polychil dannie ot h/w = 0

Wp1

Wp3

W3

dannie ot proizv = 1

W1

W2

proizvoditel polychil dannie ot h/w = 1

Wp1

Wp3

W3

dannie ot proizv = 2

W1

W2

proizvoditel polychil dannie ot h/w = 2

Wp1

Wp3

W3

dannie ot proizv = 3

W1

W2

proizvoditel polychil dannie ot h/w = 3

Wp1

Wp3

W3

dannie ot proizv = 4

W1

W2

Заключение

Операционная система QNX является мощной сетевой операционной системой, позволяющей проектировать сложные программные комплексы, работающие в реальном времени как на локальном компьютере, так и в рамках распределенной вычислительной системы.

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

Основным языком программирования в системе является язык Си, широко используемый в настоящее время на большинстве персональных компьютеров. Это позволяет с небольшими доработками перенести необходимое накопленное программное обеспечение в среду операционной системы QNX для организации его работы в среде распределенной обработки.

Более подробно ознакомиться с операционной системой реального времени QNX, с особенностями функционирования ее составных частей, таких как, например, графическая оболочка Photon и встроенная ОС РВ Neutrino, а также познакомиться с многочисленными примерами приложений, использующих QNX, Вы можете непосредственно на WEB-сервере фирмы QSSL[5], а также используя отечественные Интернет ресурсы [6,7].