ОС1/Модификације предрок 2019
< ОС1
Пређи на навигацију
Пређи на претрагу
- Овај рок није решен. Помозите SI Wiki тако што ћете га решити.
Следеће модификације су се појавиле на одбрани пројекта у предроку 2019.
20 поена
- Проширити класу
Semaphore
статичком методомaddOwner()
и нестатичком методомremoveOwner(ID id)
које додају и уклањају власнике семафора, респективно. addOwner()
додаје текућу нит као власника.removeOwner(ID id)
уклања нит са задатимID
-јем уколико је она била власник.- Уколико методе
wait()
илиsignal()
позове нит која не припада скупу власника, оне немају ефекта.
Решење
Пример теста.
#include "thread.h"
#include "intLock.h"
#include "semaphor.h"
Semaphore sem(1);
class testThread : public Thread {
public:
testThread(int i) : Thread() { this->ind = i; }
~testThread() { waitToComplete(); }
protected:
void run() {
if (ind % 2) sem.addOwner();
while (1) {
if (sem.wait(0) != -1) {
intLock
printf("%d Usao u kriticnu sekciju\n", ind);
intUnlock
sem.signal();
intLock
printf("%d Izasao iz kriticne sekcije\n", ind);
intUnlock
sem.removeOwner(Thread::getRunningId());
}
else break;
}
}
private:
int ind;
};
void tick() {}
const int N = 20;
int userMain(int argc, char* argv[]) {
testThread *thrs[N];
for (int i = 0; i < N; i++) {
thrs[i] = new testThread(i);
thrs[i]->start();
}
for (int j = 0; j < N; j++) {
delete thrs[j];
}
printf("Kraj!\n");
}