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

Извор: SI Wiki
< ОС1
Датум измене: 22. септембар 2021. у 10:53; аутор: Ivan Pešić (разговор | доприноси) (можда није писало нестатичка метода али свеједно)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Следеће модификације су се појавиле на одбрани пројекта у августовском року 2021.

30 поена

  • У класи Тхреад додати методу int olderSiblingCount() која враћа број незавршене старије браће тренутне нити. Уколико нит није настала fork()-ом, метода враћа -1.
  • Нит А је старији брат нити Б ако су и нит А и нит Б настале форковањем исте нити, али је А стартована пре Б.
  • Написати тест пример на следећи начин:
  • Форком направити 5 деце а затим у сваком детету генерисати случајан број num_iter (од 3 до 10) и у петљи која итерира num_iter пута исписивати следећу поруку: "Thread id: x/num_iter olderSiblingCount: res" где је id ИД тренутне нити, x тренутна итерација петље, num_iter претходно случајно генерисан број, а res повратна вредност olderSiblingCount() методе за текућу нит.
  • Такође додати семафор који у свакој итерацији детета успављује дете на рандом време од 50 до 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 << " olderSiblingCount = " << (Thread::getThreadById(Thread::getRunningId()))->olderSiblingCount() << endl;
      intUnlock
      sleeper.wait(1 + (rand() % 5));
    }
    Thread::exit();
  }
  Thread::waitForForkChildren();
}