ОС1/Модификације август 2021

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

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 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 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 iterira num_iter puta ispisivati sledeću poruku: "Thread id: x/num_iter olderSiblingCount: res" gde je id ID trenutne niti, x trenutna iteracija petlje, num_iter prethodno slučajno generisan broj, a res povratna vrednost olderSiblingCount() 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 << " olderSiblingCount = " << (Thread::getThreadById(Thread::getRunningId()))->olderSiblingCount() << endl;
      intUnlock
      sleeper.wait(1 + (rand() % 5));
    }
    Thread::exit();
  }
  Thread::waitForForkChildren();
}