- •Національний авіаційний університет
- •Лабораторний практикум з дисципліни «Мультиплатформені операційні середовища»
- •Визначення, позначення і скорочення
- •2.2. Використання клавіатури пк в ос qnx
- •2.3. Основні команди в ос qnx
- •2.4. Робота в файловій системі ос qnx
- •2.5. Ініціювання і завершення роботи в графічній оболонці Photon
- •3. Зміст звіту про лабораторну роботу
- •4. Питання для самоконтролю
- •5. Завдання на лабораторну роботу
- •Лабораторна робота № 2. Компіляція програм Короткі теоретичні відомості
- •Мікроядро
- •Системні і користувацькі процеси
- •Драйвери пристроїв
- •Зв'язок між процесами (ipc)
- •Qnx як мережа
- •Текст програми
- •Лабораторна робота №4. Повідомлення Короткі теоретичні відомості Архітектура і структура обміну повідомленнями
- •Текст програми
- •Послідовність дій
- •Результати
- •Лабораторна робота № 5. Тайм-аути Короткі теоретичні відомості Тайм-аути ядра
- •Текст програми
- •Текст програми
- •Послідовність дій
- •Результати
- •Послідовність дій
- •Результати
- •Лабораторна робота № 8. Створення найпростішого сервера в ос qnx
- •Короткі теоретичні відомості Функція Socket
- •Функція Bind
- •Функції listen і accept
- •Читання з сокета
- •Запис в сокет
- •Закриття сокета
Текст програми
#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);
Послідовність дій
Запустити програму на виконання і зіставляти те, що вона виводить на екран з текстом програми.
Результати
# 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
#
Лабораторна робота 6. Синхронізація процесів. Бар’єри
Короткі теоретичні відомості
Застосування бар'єру
Два методи синхронізації: один метод із застосуванням функції pthreadJoin(), який ми тільки що розглянули, і метод із застосуванням бар'єру.
Основний потік повинен дочекатися того моменту, коли всі робочі потоки завершать роботу, і тільки потім можна починати наступну частину програми.
Однак, із застосуванням функції pthreadJoin() ми очікуємо завершення потоків. Це означає, що на момент її розблокування потоків немає більше з нами; вони закінчили роботу і завершилися.
У випадку з бар'єром, ми чекаємо «зустрічі» певного числа потоків у бар'єру. Коли задане число потоків досягнуто, ми їх всі розблокуємо (зауважте, що потоки при цьому продовжать виконувати свою роботу).
Спочатку бар'єр слід створити за допомогою функції barrier_init():
#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_mit(), не викличе функцію barrier'_waU() (вони також будуть блоковані). Після того як потрібне число потоків виконає виклик функції barrier_wait(), всі ці потоки будуть розблоковані «одночасно».
