ОС1/Модификације август 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
м (nisam video ovo) |
м (Исправка) |
||
Ред 3: | Ред 3: | ||
== 30 poena == | == 30 poena == | ||
* U klasi Thread dodati nestatičku metodu <code>int allOlderSiblings()</code> koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala fork()-om, metoda vraća -1. | * U klasi Thread dodati nestatičku metodu <code>int allOlderSiblings()</code> koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala <code>fork()</code>-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'' nastala pre ''B''. | * Nit ''A'' je stariji brat niti ''B'' ako su i nit ''A'' i nit ''B'' nastale forkovanjem iste niti ali je ''A'' nastala pre ''B''. | ||
Верзија на датум 21. септембар 2021. у 13:17
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.
30 poena
- U klasi Thread dodati nestatičku metodu
int allOlderSiblings()
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 nastala 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 allOlderSiblings: res
" gde jeid
ID trenutne niti,x
trenutna iteracija petlje,num_iter
prethodno slučajno generisan broj, ares
povratna vrednostallOlderSiblings()
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 << " allOlderSiblings = " << (Thread::getThreadById(Thread::getRunningId))->allOlderSiblings() << endl;
intUnlock
sleeper.wait(1 + (rand() % 5));
}
}
}