Tutorial05 Solution
Tutorial05 Solution
S. Wallentowitz
FiFo Implementation
int data[N]; unsigned int start; unsigned int end; void enqueue(int d) { while(((end+1)%N)==start)) {} data[end] = d; end = (end+1)%N; } int dequeue() { int d; while(end==start) {} d=data[start]; start=(start+1)%N; return d; }
start=(start+1)%N;
} return d; }
Condition Variable
void enqueue(int d) { mutex_lock(&rlock); if(((end+1)%N)==start)) { cond_wait(&wcond,&rlock); } data[end] = d; end = (end+1)%N; cond_signal(&rcond); mutex_unlock(&rlock); }
int dequeue() { int d; mutex_lock(&wlock); if(end==start) { cond_wait(&rcond,&wlock); } d=data[start]; start=(start+1)%N; cond_signal(&wcond); mutex_unlock(&wlock); return d; }
Non-Blocking implementation
void enqueue(int d) { while(((end+1)%N)==start)) {} data[end] = d; end = (end+1)%N; } int dequeue() { int d;
while(end==start) {}
d=data[start]; start=(start+1)%N;
return d;
}
Chip Multicore Processors Tutorial 5 8 S. Wallentowitz Institute for Integrated Systems
Simple, fast, and practical non-blocking and blocking concurrent queue algorithms, M. Michael, M. Scott, PODC '96 A Pragmatic Implementation of Non-blocking Linked-lists, T. Harris, LNCS 2180 Chip Multicore Processors Tutorial 5 14 S. Wallentowitz
Semaphore
The Readers-Writers Problem is a concurrency problem. A shared ressource is used by threads reading from it and others writing from it. No thread should access the ressource while it is written, but it is allowed that several readers read from the resource concurrently. Develop an optimal solution to this problem using semaphores.
Readers-Writers Problem
void read(){ // the read action } void write() { // the write action }
void write() { acquire(mutex1); wcount++; if(wcount==1) acquire(rsem); release(mutex1); acquire(wsem); // the write action release(wsem); acquire(mutex1); wcount--; if(wcount==0) release(rsem); release(mutex1); }