Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

In the class the implementation of the readers-writers problem using SDL threads

ID: 3671297 • Letter: I

Question

In the class the implementation of the readers-writers problem using SDL threads has been presented. However, the read and write tasks of the reader thread and the writer thread are not given. Implement these tasks as reading and writing of a file named counter.txt, which contains an integer counter. A reader thread reads the counter from the file, and prints out its thread name and the value of the counter. A writer thread increments the value of the counter in the file, prints out its thread name and the new value of the counter. Each thread repeats its task indefinitely in a random amount of time between 0 and 3000 ms. Your main program should create 20 reader threads and 3 writer threads.

Explanation / Answer

//running data:

run:

Create/start the thread Writer Thread-0: Started Writer Thread-1: Started Writer Thread-2: Started Reader Thread-3: Started Reader Thread-5: Started Reader Thread-4: Started Reader Thread-6: Started Reader Thread-7: Started Reader Thread-8: Started Reader Thread-9: Started Reader Thread-10: Started Reader Thread-11: Started Reader Thread-12: Started Reader Thread-14: Started Reader Thread-13: Started Reader Thread-15: Started Reader Thread-17: Started Reader Thread-16: Started Reader Thread-18: Started Reader Thread-19: Started Reader Thread-20: Started

Reader Thread-21: Started

Reader Thread-22: Started

WRITER: Thread-0 Writing... Counter: 1 WRITER: Thread-1 Writing... Counter: 2 WRITER: Thread-2 Writing... Counter: 3 Reader: Thread-6 is reading ... Counter: 3 Reader: Thread-8 is reading ... Counter: 3 Reader: Thread-11 is reading ... Counter: 3 Reader: Thread-16 is reading ... Counter: 3 Reader: Thread-3 is reading ... Counter: 3 Reader: Thread-18 is reading ... Counter: 3 Reader: Thread-20 is reading ... Counter: 3 Reader: Thread-22 is reading ... Counter: 3 Reader: Thread-19 is reading ... Counter: 3 Reader: Thread-21 is reading ... Counter: 3 Reader: Thread-17 is reading ... Counter: 3 Reader: Thread-15 is reading ... Counter: 3 Reader: Thread-14 is reading ... Counter: 3 Reader: Thread-13 is reading ... Counter: 3 Reader: Thread-12 is reading ... Counter: 3 Reader: Thread-9 is reading ... Counter: 3 Reader: Thread-10 is reading ... Counter: 3 Reader: Thread-5 is reading ... Counter: 3 Reader: Thread-4 is reading ... Counter: 3 Reader: Thread-7 is reading ... Counter: 3 WRITER: Thread-1 Writing... Counter: 4 Reader: Thread-17 is reading ... Counter: 4 Reader: Thread-22 is reading ... Counter: 4 Reader: Thread-9 is reading ... Counter: 4 Reader: Thread-5 is reading ... Counter: 4 Reader: Thread-18 is reading ... Counter: 4 Reader: Thread-5 is reading ... Counter: 4 WRITER: Thread-1 Writing... Counter: 5 WRITER: Thread-0 Writing... Counter: 6 Reader: Thread-17 is reading ... Counter: 6 Reader: Thread-16 is reading ... Counter: 6 Reader: Thread-13 is reading ... Counter: 6 Reader: Thread-22 is reading ... Counter: 6 WRITER: Thread-1 Writing... Counter: 7 Reader: Thread-8 is reading ... Counter: 7 WRITER: Thread-2 Writing... Counter: 8 Reader: Thread-15 is reading ... Counter: 8 Reader: Thread-19 is reading ... Counter: 8 Reader: Thread-10 is reading ... Counter: 8 Reader: Thread-13 is reading ... Counter: 8 Reader: Thread-6 is reading ... Counter: 8 Reader: Thread-21 is reading ... Counter: 8 Reader: Thread-10 is reading ... Counter: 8 Reader: Thread-4 is reading ... Counter: 8 Reader: Thread-12 is reading ... Counter: 8 WRITER: Thread-2 Writing... Counter: 9 Reader: Thread-9 is reading ... Counter: 9 Reader: Thread-12 is reading ... Counter: 9 Reader: Thread-4 is reading ... Counter: 9 WRITER: Thread-1 Writing... Counter: 10 Reader: Thread-20 is reading ... Counter: 10

Reader: Thread-7 is reading ... Counter: 10 Reader: Thread-16 is reading ... Counter: 10 Reader: Thread-3 is reading ... Counter: 10 Reader: Thread-11 is reading ... Counter: 10 Reader: Thread-14 is reading ... Counter: 10 Reader: Thread-4 is reading ... Counter: 10 Reader: Thread-22 is reading ... Counter: 10 Reader: Thread-13 is reading ... Counter: 10 Reader: Thread-11 is reading ... Counter: 10 WRITER: Thread-2 Writing... Counter: 11 Reader: Thread-18 is reading ... Counter: 11 Reader: Thread-5 is reading ... Counter: 11 WRITER: Thread-1 Writing... Counter: 12 Reader: Thread-19 is reading ... Counter: 12 Reader: Thread-6 is reading ... Counter: 12 Reader: Thread-21 is reading ... Counter: 12 Reader: Thread-22 is reading ... Counter: 12 Reader: Thread-16 is reading ... Counter: 12 Reader: Thread-17 is reading ... Counter: 12 Reader: Thread-8 is reading ... Counter: 12 Reader: Thread-9 is reading ... Counter: 12 WRITER: Thread-0 Writing... Counter: 13 Reader: Thread-19 is reading ... Counter: 13 Reader: Thread-8 is reading ... Counter: 13 Reader: Thread-15 is reading ... Counter: 13 WRITER: Thread-2 Writing... Counter: 14 Reader: Thread-4 is reading ... Counter: 14 Reader: Thread-5 is reading ... Counter: 14 Reader: Thread-13 is reading ... Counter: 14 Reader: Thread-10 is reading ... Counter: 14 Reader: Thread-9 is reading ... Counter: 14 Reader: Thread-11 is reading ... Counter: 14 Reader: Thread-11 is reading ... Counter: 14 BUILD STOPPED (total time: 5 seconds)

//File: ReaderWriter.java

package cse660hw11;

import java.io.File;

import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import java.util.Scanner;

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* @author Thanh */

public class ReaderWriter {

final Lock mutex = new ReentrantLock();

final Condition readerQueue = mutex.newCondition(); final Condition writerQueue = mutex.newCondition(); int nReaders = 0; // number of reader threads

int nWriters = 0; // number of writer threads (0 or 1) String file = "counter.txt";

public static Random rand = new Random();

public void init() { FileWriter f; try {

f = new FileWriter(new File(file)); f.write(new Integer(0).toString()); f.close();

} catch (IOException e) { e.printStackTrace();

}

}

void reader() throws InterruptedException { mutex.lock(); //mutual exclusion while (!(nWriters == 0)) {

readerQueue.await();//wait in readerQueue till no more writers

}

nReaders++;

//one more reader

mutex.unlock();

readToFile(file);

mutex.lock();

//need mutual exclusion

if (--nReaders == 0) { writerQueue.signal();//wake up a waiting writer

}

mutex.unlock();

}

void writer() throws InterruptedException { mutex.lock();

while (!((nReaders == 0) && (nWriters == 0))) { writerQueue.await();//wait in writerQueue

} // until no more writer & readers nWriters++; //one writer

mutex.unlock();

writeToFile(file);

mutex.lock(); //need mutual exclusion nWriters--; //only one writer at a time writerQueue.signal(); //wake up a waiting writer

readerQueue.signalAll(); //wake up all waiting readers mutex.unlock();

}

void readToFile(String path){ try{

Scanner reader = new Scanner(new FileInputStream(path)); int x = reader.nextInt();

System.out.printf("Reader: " + Thread.currentThread().getName() + " is reading ..."); System.out.printf(" Counter: %d ", x);

}

catch(IOException ex){ ex.printStackTrace();

}

}

void writeToFile(String path){ int counterToWrite;

try {

Scanner reader = new Scanner(new FileInputStream(path)); counterToWrite = (int) reader.nextInt();

counterToWrite++;

FileWriter f = new FileWriter(new File(path)); f.write(new Integer(counterToWrite).toString()); f.close();

System.out.printf("WRITER: " + Thread.currentThread().getName() + " Writing... "); System.out.printf(" Counter: %d ", counterToWrite);

} catch (IOException ex) { ex.printStackTrace();

}

}

}

//File: Main.java

package cse660hw11;

import java.util.Random; /**

* @author Thanh */

public class ReaderWriterMain {

public final static int NUMBER_READ_THREAD = 20; public final static int NUMBER_WRITE_THREAD = 3;

public static ReaderWriter readerWriterClass = new ReaderWriter(); public static Random rand = new Random();

static class readerThread extends Thread { @Override

public void run() {

System.out.print("Reader " + getName() + ": Started ");

while (true) { try {

readerWriterClass.reader();

Thread.sleep(rand.nextInt(3000)); } catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

static class writerThread extends Thread { @Override

public void run() {

System.out.print("Writer " + getName() + ": Started "); while(true){

try{

readerWriterClass.writer();

Thread.sleep(rand.nextInt(3000)); }catch(InterruptedException ex){

ex.printStackTrace();

}

}

}

}

public static void main(String[] args){ readerWriterClass.init();

readerThread readerThreads[] = new readerThread[NUMBER_READ_THREAD]; writerThread writerThreads[] = new writerThread[NUMBER_WRITE_THREAD]; System.out.print("Create/start the thread ");

for (int i = 0; i < NUMBER_WRITE_THREAD; ++i) { writerThreads[i] = new writerThread(); writerThreads[i].start();

}

for (int i = 0; i < NUMBER_READ_THREAD; ++i) { readerThreads[i] = new readerThread(); readerThreads[i].start();

}

}

}

2. (20 points)We discussed in class the readers-writers problem with writers priority, which can be solved in guarded commands:

void reader()

{

when ( writers == 0 ) [

readers++;

]

//read

[readers--;]

}

void writer()

{

[writers++;]

when ( (readers == 0) && (active_writers == 0) )[

active_writers++;

]

//write

[writers--; active_writers--;]

}

Here writers represents the number of threads that are either writing or waiting to write. The variable active_writers represents the number of threads ( 0 or 1 ) that are currently writing.

Implement the solution using Java threads. Again simulate the tasks by reading from and writing to a file named counter.txt as in the previous problem.

Besides the source code, turn in scripts showing that you compile and run the program successfully. Turn in also some sample outputs.

Answer:

//running data:

run:

Create/start the thread Writer Thread-0: Started Writer Thread-1: Started Reader Thread-3: Started Writer Thread-2: Started Reader Thread-4: Started Reader Thread-8: Started Reader Thread-7: Started Reader Thread-6: Started Reader Thread-9: Started Reader Thread-11: Started Reader Thread-5: Started Reader Thread-12: Started Reader Thread-10: Started Reader Thread-15: Started

Reader Thread-14: Started

Reader Thread-13: Started

Reader Thread-16: Started

Reader Thread-18: Started

Reader Thread-19: Started

Reader Thread-17: Started

Reader Thread-20: Started

Reader Thread-21: Started

Reader Thread-22: Started

WRITER: Thread-0 Writing... Counter: 1

WRITER: Thread-1 Writing... Counter: 2

WRITER: Thread-2 Writing... Counter: 3

Reader: Thread-3 Reading...Reader: Thread-5 Reading...Reader: Thread-11 Reading...Reader: Thread-4

Reading... Counter: 3

Reader: Thread-8 Reading... Counter: 3

Counter: 3

Reader: Thread-9 Reading... Counter: 3

Counter: 3

Counter: 3

Reader: Thread-12 Reading... Counter: 3

Reader: Thread-6 Reading... Counter: 3

Reader: Thread-19 Reading... Counter: 3

Reader: Thread-10 Reading...Reader: Thread-15 Reading...Reader: Thread-7 Reading... Counter: 3

Counter: 3

Reader: Thread-22 Reading... Counter: 3

Reader: Thread-13 Reading... Counter: 3

Reader: Thread-16 Reading... Counter: 3

Reader: Thread-20 Reading... Counter: 3

Reader: Thread-14 Reading... Counter: 3

Reader: Thread-17 Reading... Counter: 3

Reader: Thread-18 Reading... Counter: 3

Reader: Thread-21 Reading... Counter: 3

Counter: 3

Reader: Thread-18 Reading... Counter: 3

WRITER: Thread-2 Writing... Counter: 4

Reader: Thread-8 Reading... Counter: 4

Reader: Thread-21 Reading... Counter: 4

Reader: Thread-15 Reading... Counter: 4

Reader: Thread-20 Reading... Counter: 4

Reader: Thread-6 Reading... Counter: 4

Reader: Thread-22 Reading... Counter: 4

Reader: Thread-11 Reading... Counter: 4

Reader: Thread-6 Reading... Counter: 4

Reader: Thread-8 Reading... Counter: 4

WRITER: Thread-0 Writing... Counter: 5

Reader: Thread-9 Reading... Counter: 5

Reader: Thread-3 Reading... Counter: 5

Reader: Thread-7 Reading... Counter: 5

Reader: Thread-21 Reading... Counter: 5

Reader: Thread-21 Reading... Counter: 5

WRITER: Thread-0 Writing... Counter: 6

Reader: Thread-5 Reading... Counter: 6

WRITER: Thread-1 Writing... Counter: 7

Reader: Thread-16 Reading... Counter: 7

Reader: Thread-12 Reading... Counter: 7

Reader: Thread-22 Reading... Counter: 7

WRITER: Thread-2 Writing... Counter: 8

Reader: Thread-5 Reading... Counter: 8

WRITER: Thread-1 Writing... Counter: 9

Reader: Thread-18 Reading... Counter: 9

Reader: Thread-18 Reading... Counter: 9

Reader: Thread-19 Reading... Counter: 9

Reader: Thread-4 Reading... Counter: 9

Reader: Thread-10 Reading... Counter: 9

Reader: Thread-11 Reading... Counter: 9

Reader: Thread-5 Reading... Counter: 9

Reader: Thread-17 Reading... Counter: 9

Reader: Thread-15 Reading... Counter: 9

Reader: Thread-3 Reading... Counter: 9

Reader: Thread-12 Reading... Counter: 9

Reader: Thread-22 Reading... Counter: 9

Reader: Thread-20 Reading... Counter: 9

Reader: Thread-7 Reading... Counter: 9

Reader: Thread-14 Reading... Counter: 9

Reader: Thread-8 Reading... Counter: 9

Reader: Thread-6 Reading... Counter: 9

Reader: Thread-7 Reading... Counter: 9

Reader: Thread-13 Reading... Counter: 9

Reader: Thread-17 Reading... Counter: 9

Reader: Thread-14 Reading... Counter: 9

WRITER: Thread-0 Writing... Counter: 10

Reader: Thread-8 Reading... Counter: 10

Reader: Thread-10 Reading... Counter: 10

Reader: Thread-9 Reading... Counter: 10

Reader: Thread-4 Reading... Counter: 10

Reader: Thread-20 Reading... Counter: 10

Reader: Thread-16 Reading... Counter: 10

Reader: Thread-19 Reading... Counter: 10

Reader: Thread-18 Reading... Counter: 10

Reader: Thread-13 Reading... Counter: 10

Reader: Thread-16 Reading... Counter: 10

Reader: Thread-21 Reading... Counter: 10

Reader: Thread-15 Reading... Counter: 10

Reader: Thread-8 Reading... Counter: 10

Reader: Thread-5 Reading... Counter: 10

Reader: Thread-10 Reading... Counter: 10

WRITER: Thread-2 Writing... Counter: 11

WRITER: Thread-1 Writing... Counter: 12

Reader: Thread-3 Reading... Counter: 12

Reader: Thread-8 Reading... Counter: 12

Reader: Thread-9 Reading... Counter: 12

Reader: Thread-13 Reading... Counter: 12

Reader: Thread-12 Reading... Counter: 12

WRITER: Thread-1 Writing... Counter: 13

Reader: Thread-17 Reading... Counter: 13

Reader: Thread-20 Reading... Counter: 13

Reader: Thread-11 Reading... Counter: 13

Reader: Thread-22 Reading... Counter: 13

Reader: Thread-6 Reading... Counter: 13

Reader: Thread-21 Reading... Counter: 13

Reader: Thread-5 Reading... Counter: 13

Reader: Thread-14 Reading... Counter: 13

Reader: Thread-4 Reading... Counter: 13

Reader: Thread-7 Reading... Counter: 13

Reader: Thread-18 Reading... Counter: 13

WRITER: Thread-0 Writing... Counter: 14

WRITER: Thread-1 Writing... Counter: 15

WRITER: Thread-2 Writing... Counter: 16

Reader: Thread-16 Reading... Counter: 16

Reader: Thread-17 Reading... Counter: 16

Reader: Thread-13 Reading... Counter: 16

Reader: Thread-17 Reading... Counter: 16

Reader: Thread-11 Reading... Counter: 16

Reader: Thread-19 Reading... Counter: 16

BUILD STOPPED (total time: 6 seconds)

// File: ThreadPriority.java

package cse660hw12;

/**

* @author Thanh */

import java.io.File;

import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import java.util.Scanner;

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class ReaderWriterPriority {

final Lock mutex = new ReentrantLock();

final Condition readerQueue = mutex.newCondition(); // cond variable final Condition writerQueue = mutex.newCondition(); // cond variable int nReaders = 0; // number of reader threads

int nWriters = 0; // number of writer threads (0 or 1)

int nActiveWriters = 0; // number of threads currently writing String file = "counter.txt";

public static Random rand = new Random();

public void init() { FileWriter f; try {

f = new FileWriter(new File(file)); f.write(new Integer(0).toString()); f.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

void reader() throws InterruptedException { mutex.lock(); // mutual exclusion

while (nWriters != 0)) {

readerQueue.await(); // wait in readerQueue until no more writers

}

nReaders++; // one more reader mutex.unlock(); readToFile(file);

mutex.lock(); // need mutual exclusion if (--nReaders == 0) {

writerQueue.signal();// wake up a waiting writer

}

mutex.unlock();

}

void writer() throws InterruptedException { mutex.lock();

nWriters++; // a writer has arrived

while (!((nReaders == 0) && (nActiveWriters == 0))) { writerQueue.await(); // wait in writerQueue

} // until no more writer & readers nActiveWriters++; // one active writer mutex.unlock();

writeToFile(file);

mutex.lock(); // need mutual exclusion nActiveWriters--; // only one active writer at a time

if (--nWriters == 0) // no more waiting writers, so wake

{

readerQueue.signalAll();// up all waiting readers } else // has waiting writer

{

writerQueue.signal();// wake up one waiting writer

}

mutex.unlock();

}

public void readToFile(String path) {

try {

Scanner reader = new Scanner(new FileInputStream(path)); int x = reader.nextInt();

System.out.printf("Reader: " + Thread.currentThread().getName() + " Reading..."); System.out.printf(" Counter: %d ", x);

} catch (IOException e) { e.printStackTrace();

}

}

public void writeToFile(String path) { int counterToWrite;

try {

Scanner reader = new Scanner(new FileInputStream(path)); counterToWrite = (int) reader.nextInt();

counterToWrite++;

FileWriter f = new FileWriter(new File(path)); f.write(new Integer(counterToWrite).toString()); f.close();

System.out.printf("WRITER: " + Thread.currentThread().getName() + " Writing... ");

System.out.printf(" Counter: %d ", counterToWrite);

} catch (IOException e) { e.printStackTrace();

}

}

}

//File: main.java

package cse660hw12;

/**

* @author Thanh */

import java.util.Random;

public class Main {

public final static int NUMBER_READ_THREAD = 20; public final static int NUMBER_WRITE_THREAD = 3;

public static ReaderWriterPriority readerWriterClass = new ReaderWriterPriority(); public static Random rand = new Random();

static class readerThread extends Thread {

public void run() {

System.out.print("Reader " + getName() + ": Started ");

while (true) { try {

readerWriterClass.reader(); int time = rand.nextInt(3000); Thread.sleep(time);

} catch (InterruptedException e) { e.printStackTrace();

}

}

}

}

static class writerThread extends Thread {

public void run() {

System.out.print("Writer " + getName() + ": Started "); // while (retries-- != 0) {

while (true) { try {

readerWriterClass.writer(); int time = rand.nextInt(3000); Thread.sleep(time);

} catch (InterruptedException e) { e.printStackTrace();

}

}

}

}

public static void main(String[] args) { readerWriterClass.init();

readerThread readerThreads[] = new readerThread[NUMBER_READ_THREAD]; writerThread writerThreads[] = new writerThread[NUMBER_WRITE_THREAD];

System.out.print("Create/start the thread ");

for (int i = 0; i < NUMBER_WRITE_THREAD; ++i) { writerThreads[i] = new writerThread(); writerThreads[i].start();

}

for (int i = 0; i < NUMBER_READ_THREAD; ++i) { readerThreads[i] = new readerThread(); readerThreads[i].start();

}

}

}

3. (10 points ) Consider a chain of processes P1, P2, ..., Pn implementing a multitiered client-server architecture. Process Pi is client of process Pi+1, and Pi will return a reply to Pi-1 only after receiving a reply from Pi+1. What are the main problems with this organization when taking a look at the request-reply performance at process P1?

Answer: The main problems with this organization is very slow or getting stuck when it processes a large data. The reason is that P1 has to wait for P2, P3, and so on until Pn is processed, and then it wait for reply chain from Pn, Pn-1, Pn-2, … Besides, if one Pi in chain gets stuck, then whole chain will be stuck or failed.

4. (10 points) Construct a general resource graph for the following scenario and determine if the graph is completely reducible: R1, R2, and R3 are reusable resources with a total of two, two, and three units. Process P1 is allocated one unit each of R2 and R3 and is requesting one unit of R1. Process P2 is allocated one unit of R1 and is requesting two units of R3. Process P3 is allocated one unit each of R1 and R2 and is requesting one unit of R3.

Answer:

P1

P2

P3

P1

P2

P3

R1

R2

R1

R2

R3

R3

P1

P3

P1

P3

R1

R2

R1

R2

R3

R3

P3

P3

R1

R2

R1

R2

R3

R3

R1

R2

R3

}

nReaders++;

//one more reader

mutex.unlock();

readToFile(file);

mutex.lock();

//need mutual exclusion