ОС1/Модификације август 2021 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (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 iterira num_iter puta ispisivati sledeću poruku: "Thread id: x/num_iter allOlderSiblings: res" gde je id ID trenutne niti, x trenutna iteracija petlje, num_iter prethodno slučajno generisan broj, a res povratna vrednost allOlderSiblings() metode za tekuću nit.
  • Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od 50 do 250ms.

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));
    }
  }
}