ОС1/Модификације јул 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
(→Решење - тест: big fix) |
|||
(Није приказана једна међуизмена другог корисника) | |||
Ред 43: | Ред 43: | ||
intLock | intLock | ||
printf("SIGNALED - THREAD ID = %d", Thread::getRunningId()); | printf("SIGNALED - THREAD ID = %d", Thread::getRunningId()); | ||
intUnlock | |||
waiter.wait(rand()%10+1); | waiter.wait(rand()%10+1); | ||
} | } | ||
Ред 50: | Ред 51: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Категорија:ОС1]] | |||
[[Категорија:Лабораторијске вежбе]] |
Тренутна верзија на датум 12. јул 2021. у 20:16
Следеће модификације су се појавиле на одбрани пројекта у јулском року 2021.
Основа
- Треба прошити класу
IVTEntry
тако да може сигналује више догађаја у редоследу по приоритетима. - Треба изменити конструктор класе
Event::Event(IVTNo ivtNo, int priority)
тако да прима приоритет по ком ће се ослобађати (већи је приоритетнији).
20 поена
- Направити програм који креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем.
- Приоритет догађаја поставити на ID нити.
- За бирање дужине чекања користити функцију
rand()
изstdlib.h
- У методи
Event::wait()
догађаја додати да се пре блокирања исписујеBLOCKED - THREAD ID = x
, где је x ID нити. - Након ослобађања догађаја треба да се испише
SIGNALED - THREAD ID = x
, где је x ID нити.
30 поена
Поставка
- Направити програм који
fork()
ом креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. - Приоритет догађаја поставити на ID нити.
- За бирање дужине чекања користити функцију
rand()
изstdlib.h
- У методи
Event::wait()
догађаја додати да се пре блокирања исписујеBLOCKED - THREAD ID = x
, где је x ID нити. - Након ослобађања догађаја треба да се испише
SIGNALED - THREAD ID = x
, где је x ID нити.
Решење - тест
#include <stdlib.h>
#include <thread.h>
#include <semaphore.h>
#include <event.h>
#include <intLock.h> // iz javnog testa
PREPAREENTRY(9,1); // bitno je da se zove stara rutina
int userMain(int argc, char* argv[]) {
for(int i = 0; i < 50; i++){
int pid = Thread::fork();
if (pid) continue;
Event keyboard(9, Thread::getRunningId());
Semaphore waiter(0);
while(1){
keyboard.wait(); // čekamo
intLock
printf("SIGNALED - THREAD ID = %d", Thread::getRunningId());
intUnlock
waiter.wait(rand()%10+1);
}
}
Thread::waitForForkChildren();
}