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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(августовска модификација од 30п)
 
м (mala latinizacija)
Ред 2: Ред 2:
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.


== 30 поена ==
== 30 poena ==
* U klasi Thread dodati nestatičku metodu <code>int allOlderSiblings()</code> koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala fork()-om, metoda vraća -1.
* U klasi Thread dodati nestatičku metodu <code>int allOlderSiblings()</code> 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''.
* 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''.

Верзија на датум 20. септембар 2021. у 17:58

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.

Решење

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