ОС1/Модификације август 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
м (mala latinizacija) |
м (nisam video ovo) |
||
Ред 10: | Ред 10: | ||
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od <code>50</code> do <code>250ms</code>. | *Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od <code>50</code> do <code>250ms</code>. | ||
=== | === Rešenje === | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
int userMain(int argc, char** argv) { | int userMain(int argc, char** argv) { |
Верзија на датум 20. септембар 2021. у 18:01
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 nastala fork()-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));
}
}
}