ОС1/Модификације август 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
м (можда није писало нестатичка метода али свеједно) |
|||
Ред 3: | Ред 3: | ||
== 30 poena == | == 30 poena == | ||
* U klasi Thread dodati | * U klasi Thread dodati metodu <code>int olderSiblingCount()</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'' startovana pre ''B''. | * 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''. | ||
Тренутна верзија на датум 22. септембар 2021. у 10:53
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();
}