I wrote a program to set up the Producer/Consumer relationship and right now it is not synchronized and I want to implement Semaphores but I am having trouble with it. I want the producer/consumer threads to behave like this:
Producer Thread: void main() { int nextValueProduced; //variable to store value produced while (!done) { nextValueProduced = generateTheValue(); //produce value P( valueconsumed); //wait until value is consumed sharedValue = nextValueProduced; V( valueProduced); } } Consumer Thread: void main() { int nextValue; //variable to store consumed while (!done) { P( valueProduced); //wait until value is produced nextValueConsumed = sharedValue; V( valueConsumed); //signal value has been consumed processTheValue( nextvalueconsumed); } }
This is what I have now for the producer thread:
public class Producer extends Thread{ private Buffer sharedLocation; public Producer (Buffer shared) { super("Producer"); sharedLocation = shared; } public void run() { for (int count = 1; count <= 4; count++){ try { Thread.sleep((int) (Math.random() * 3001)); value //check to see if the value has been consumed P( valueConsumed ); sharedLocation.set(count); //let consumer thread know it can consume the value } catch (InterruptedException exception) { exception.printStackTrace(); } } System.err.println(getName() + " done producing."); } }
The consumer thread:
public class Consumer extends Thread{ private Buffer sharedLocation; public Consumer (Buffer shared) { super("Consumer"); sharedLocation = shared; } public void run() { int sum = 0; for (int count=1; count<=4; count++) { try{ Thread.sleep((int) (Math.random() * 3001)); sum += sharedLocation.get(); } catch (InterruptedException exception) { exception.printStackTrace(); } } System.err.println(getName() + " done consuming. and sum= " + sum); } }
This is what I have currently for semaphore:
public class Semaphore{ private int sharedValue; Semaphore valueProduced = new Semaphore(0); Semaphore valueConsumed = new Semaphore(1); void get(){ try { /*public class Semaphore { private int value; public Semaphore() { value = 0; } public Semaphore (int initial) { value = initial; } public void P() { wantToEnterCS(); // Use any viable busy-waiting mutex solution while (value == 0) { finishedInCS(); wantToEnterCS(); } value --; finishedInCS(); } public void V() { wantToEnterCS(); value++; finishedInCS(); } }