Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MOS-labs-3.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
655.36 Кб
Скачать

Текст програми

#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(), всі ці потоки будуть розблоковані «одночасно».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]