ОС1/Модификације август 2021
< ОС1
Пређи на навигацију
Пређи на претрагу
Следеће модификације су се појавиле на одбрани пројекта у августовском року 2021.
30 поена
- У класи Тхреад додати методу
int olderSiblingCount()
која враћа број незавршене старије браће тренутне нити. Уколико нит није насталаfork()
-ом, метода враћа -1. - Нит А је старији брат нити Б ако су и нит А и нит Б настале форковањем исте нити, али је А стартована пре Б.
- Написати тест пример на следећи начин:
- Форком направити 5 деце а затим у сваком детету генерисати случајан број
num_iter
(од 3 до 10) и у петљи која итерираnum_iter
пута исписивати следећу поруку: "Thread id: x/num_iter olderSiblingCount: res
" где јеid
ИД тренутне нити,x
тренутна итерација петље,num_iter
претходно случајно генерисан број, аres
повратна вредностolderSiblingCount()
методе за текућу нит. - Такође додати семафор који у свакој итерацији детета успављује дете на рандом време од
50
до250ms
.
Решење
int userMain(int argc, char** argv) {
for(int i = 0; i < 5; i++) {
int pid = Thread::fork();
if(pid) continue;
Semaphore sleeper(0);
int num_iter = 3 + (rand() % 8);
for(int j = 0; j < num_iter; j++) {
intLock
cout << "Thread " << Thread::getRunningId() << ": " << j << "/" << num_iter << " olderSiblingCount = " << (Thread::getThreadById(Thread::getRunningId()))->olderSiblingCount() << endl;
intUnlock
sleeper.wait(1 + (rand() % 5));
}
Thread::exit();
}
Thread::waitForForkChildren();
}