ОС1/Модификације предрок 2019 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(neki glupi test)
м (== Rešenje == -> === Rešenje ===; tabovi -> razmaci)
 
Ред 6: Ред 6:
== 20 поена ==
== 20 поена ==
* Проширити класу <code>Semaphore</code> статичком методом <code>addOwner()</code> и нестатичком методом <code>removeOwner(ID id)</code> које додају и уклањају власнике семафора, респективно.
* Проширити класу <code>Semaphore</code> статичком методом <code>addOwner()</code> и нестатичком методом <code>removeOwner(ID id)</code> које додају и уклањају власнике семафора, респективно.
* <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">
<syntaxhighlight lang="cpp">
#include "thread.h"
#include "thread.h"
#include "intLock.h"
#include "intLock.h"
Ред 24: Ред 20:
class testThread : public Thread {
class testThread : public Thread {
public:
public:
testThread(int i) : Thread() { this->ind = i; }
    testThread(int i) : Thread() { this->ind = i; }
~testThread() { waitToComplete(); }
    ~testThread() { waitToComplete(); }


protected:
protected:
void run() {
    void run() {
if (ind % 2) sem.addOwner();
        if (ind % 2) sem.addOwner();
while (1) {
        while (1) {
if (sem.wait(0) != -1) {
            if (sem.wait(0) != -1) {
intLock
                intLock
printf("%d Usao u kriticnu sekciju\n", ind);
                printf("%d Usao u kriticnu sekciju\n", ind);
intUnlock
                intUnlock
                  
                  
sem.signal();
                sem.signal();


intLock
                intLock
printf("%d Izasao iz kriticne sekcije\n", ind);
                printf("%d Izasao iz kriticne sekcije\n", ind);
intUnlock
                intUnlock


sem.removeOwner(Thread::getRunningId());
                sem.removeOwner(Thread::getRunningId());
}
            }
else break;
            else break;
}
        }
}
    }


private:
private:
int ind;
    int ind;
};
};


Ред 57: Ред 53:


int userMain(int argc, char* argv[]) {
int userMain(int argc, char* argv[]) {
testThread *thrs[N];
    testThread *thrs[N];


for (int i = 0; i < N; i++) {
    for (int i = 0; i < N; i++) {
thrs[i] = new testThread(i);
        thrs[i] = new testThread(i);
thrs[i]->start();
        thrs[i]->start();
}
    }
for (int j = 0; j < N; j++) {
    for (int j = 0; j < N; j++) {
delete thrs[j];
        delete thrs[j];
}
    }
printf("Kraj!\n");
    printf("Kraj!\n");
}
}



Тренутна верзија на датум 12. септембар 2021. у 01:56

Овај рок није решен. Помозите 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");
}