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

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(), все эти потоки будут разблокированы «одновременно».