#include #include #include #include typedef struct _PROCES { int pocetak; int kraj; } PROCES; typedef struct _SEKTOR { int idSektora; int readLock; int writeLock; } SEKTOR; pthread_mutex_t mutex; pthread_cond_t cond; int *brProcesaPoStazi; SEKTOR **disk; PROCES * procesi; int brojSektora, brojStaza, brojProcesa, igla = 1; void *obradaZahteva(void *_tid) { long tid = (long) _tid; int staraStaza = 1, idStaze, idSektora; int parnost = tid % 2; int pocetak = procesi[tid].pocetak; int kraj = procesi[tid].kraj; int trenutniSektor = pocetak; int staza = ( trenutniSektor / 100) * 100; while (trenutniSektor <= kraj) { pthread_mutex_lock(&mutex); idStaze = staza / 100; idSektora = trenutniSektor % 100; if (staraStaza != staza) brProcesaPoStazi[idStaze]++; while (igla != idStaze && brProcesaPoStazi[igla] != 0) pthread_cond_wait(&cond, &mutex); igla = idStaze; if (parnost == 0) { while (disk[idStaze][idSektora].writeLock > 0) pthread_cond_wait(&cond, &mutex); disk[idStaze][idSektora].readLock++; } else { while (disk[idStaze][idSektora].writeLock > 0 || disk[idStaze][idSektora].readLock > 0) pthread_cond_wait(&cond, &mutex); disk[idStaze][idSektora].writeLock++; } pthread_mutex_unlock(&mutex); sleep(1); printf("%d %ld\n", trenutniSektor, tid); pthread_mutex_lock(&mutex); if (parnost == 0) disk[idStaze][idSektora].readLock--; else disk[idStaze][idSektora].writeLock--; staraStaza = staza; trenutniSektor++; if (trenutniSektor % 100 == brojSektora) trenutniSektor += 100 - brojSektora; staza = (trenutniSektor / 100) * 100; if (staraStaza != staza || trenutniSektor == kraj + 1) brProcesaPoStazi[idStaze]--; pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { scanf("%d%d%d", &brojStaza, &brojSektora, &brojProcesa); pthread_t threads[brojProcesa]; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); brProcesaPoStazi = (int*) calloc(brojStaza + 1, sizeof(int)); procesi = (PROCES*) malloc(sizeof(PROCES) * brojProcesa); disk = (SEKTOR **) malloc(sizeof(SEKTOR*) * (brojStaza + 1)); for (int i = 0; i <= brojStaza; i++) disk[i] = (SEKTOR*) malloc(sizeof(SEKTOR) * brojSektora); for (int i = 0; i < brojProcesa; i++) scanf("%d%d", &procesi[i].pocetak, &procesi[i].kraj); for (long i = 0; i < brojProcesa; i++) pthread_create(threads + i, NULL, obradaZahteva, (void*) i); for (int i = 0; i < brojProcesa; i++) pthread_join(threads[i], NULL); pthread_exit(NULL); }