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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (можда није писало нестатичка метода али свеједно)
 
Ред 3: Ред 3:


== 30 poena ==
== 30 poena ==
* U klasi Thread dodati nestatičku 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.
* 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 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();
}