ОС1/Модификације август 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
(Исправка од @656800909262585856) |
м (можда није писало нестатичка метода али свеједно) |
||
(Није приказана једна међуизмена другог корисника) | |||
Ред 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'' | * 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: | * Napisati test primer na sledeći način: | ||
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj <code>num_iter</code> (od 3 do 10) i u petlji koja iterira <code>num_iter</code> puta ispisivati sledeću poruku: "<code>Thread id: x/num_iter | * Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj <code>num_iter</code> (od 3 do 10) i u petlji koja iterira <code>num_iter</code> puta ispisivati sledeću poruku: "<code>Thread id: x/num_iter olderSiblingCount: res</code>" gde je <code>id</code> ID trenutne niti, <code>x</code> trenutna iteracija petlje, <code>num_iter</code> prethodno slučajno generisan broj, a <code>res</code> povratna vrednost <code>olderSiblingCount()</code> metode za tekuću nit. | ||
*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 === | === Rešenje === | ||
Ред 20: | Ред 20: | ||
for(int j = 0; j < num_iter; j++) { | for(int j = 0; j < num_iter; j++) { | ||
intLock | intLock | ||
cout << "Thread " << Thread::getRunningId() << ": " << j << "/" << num_iter << " | cout << "Thread " << Thread::getRunningId() << ": " << j << "/" << num_iter << " olderSiblingCount = " << (Thread::getThreadById(Thread::getRunningId()))->olderSiblingCount() << endl; | ||
intUnlock | intUnlock | ||
sleeper.wait(1 + (rand() % 5)); | sleeper.wait(1 + (rand() % 5)); |
Тренутна верзија на датум 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();
}