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

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


== 30 poena ==
== 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 <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'' 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'' 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 allOlderSiblings: 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>allOlderSiblings()</code> metode za tekuću nit.
* 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 << " allOlderSiblings = " << (Thread::getThreadById(Thread::getRunningId()))->allOlderSiblings() << endl;
       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 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();
}