ОС1/Модификације предрок 2019 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
(neki glupi test) |
|||
| Ред 8: | Ред 8: | ||
* <code>addOwner()</code> додаје текућу нит као власника. <code>removeOwner(ID id)</code> уклања нит са задатим <code>ID</code>- јем уколико је она била власник. | * <code>addOwner()</code> додаје текућу нит као власника. <code>removeOwner(ID id)</code> уклања нит са задатим <code>ID</code>- јем уколико је она била власник. | ||
* Уколико методе <code>wait()</code> или <code>signal()</code> позове нит која не припада скупу власника, оне немају ефекта. | * Уколико методе <code>wait()</code> или <code>signal()</code> позове нит која не припада скупу власника, оне немају ефекта. | ||
== Решење == | |||
Пример теста. | |||
<syntaxhighlight lang="cpp"> | |||
#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"); | |||
} | |||
</syntaxhighlight> | |||
[[Категорија:Лабораторијске вежбе]] | [[Категорија:Лабораторијске вежбе]] | ||
[[Категорија:ОС1]] | [[Категорија:ОС1]] | ||
Верзија на датум 12. септембар 2021. у 01:48
- Овај рок није решен. Помозите 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");
}