ОС1/Модификације август 2021
< ОС1
Пређи на навигацију
Пређи на претрагу
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.
30 poena
- U klasi Thread dodati metodu
int olderSiblingCount()
koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastalafork()
-om, metoda vraća -1. - Nit A je stariji brat niti B ako su i nit A i nit B nastale forkovanjem iste niti, ali je A startovana pre B.
- Napisati test primer na sledeći način:
- Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj
num_iter
(od 3 do 10) i u petlji koja iteriranum_iter
puta ispisivati sledeću poruku: "Thread id: x/num_iter olderSiblingCount: res
" gde jeid
ID trenutne niti,x
trenutna iteracija petlje,num_iter
prethodno slučajno generisan broj, ares
povratna vrednostolderSiblingCount()
metode za tekuću nit. - Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od
50
do250ms
.
Rešenje
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();
}