Problem 2: H2O Building Problem

There are two kinds of threads, oxygen and hydrogen. In order to assemble these threads into water molecules, we have to create a barrier that makes each thread wait until a complete molecule is ready to proceed.As each thread passes the barrier, it should invoke bond. You must guarantee that all the threads from one molecule invoke bond before any of the threads from the next molecule do.

In other words:

• If an oxygen thread arrives at the barrier when no hydrogen threads are present, it has to wait for two hydrogen threads.

• If a hydrogen thread arrives at the barrier when no other threads are present, it has to wait for an oxygen thread and another hydrogen thread.

We don’t have to worry about matching the threads up explicitly; that is, the threads do not necessarily know which other threads they are paired up with. The key is just that threads pass the barrier in complete sets; thus, if we examine the sequence of threads that invoke bond and divide them into groups of three, each group should contain one oxygen and two hydrogen threads.

Puzzle: Write synchronization code for oxygen and hydrogen molecules that enforces these constraints.

Problem 3:Dining Savages Problem

A tribe of savages eats communal dinners from a large pot that can hold M servings of stewed missionary. When a savage wants to eat, he helps himself from the pot, unless it is empty. If the port is empty, the savage wakes up the cook and then waits until the cook has refilled the pot.

Any number of savage threads run the following code:

Unsynchronized savage code

  1. while true:
  2. getServingFromPot()
  3. eat()

And one cook thread runs this code:

Unsynchronized cook code

  1. while true:
  2. putServingsInPot(M)

The synchronization constraints are:

  • Savages cannot invoke getServingFromPot if the pot is empty.
  • The cook can invoke putServingsInPot only if the pot is empty.

Please add code for the savages and the cook that satisfies the synchronization constraints.

Solution1 for the barbershop problem:

customers = 0

mutex = Semaphore(1)

customer = Semaphore(0)

barber = Semaphore(0)

<Customer>

1 mutex.wait()

2 if customers == n+1:

3 mutex.signal()

4 leave()

5 customers += 1

6 mutex.signal()

7

8 customer.signal()

9 barber.wait()

10 getHairCut()

11

12 mutex.wait()

13 customers -= 1

14 mutex.signal()

<Barber>

1 customer.wait()

2 barber.signal()

3 cutHair()

Solution2 for the barbershop problem:

Semaphore Customers = 0

Semaphore Barber = 0

Semaphore accessSeats (mutex) = 1

intNumberOfFreeSeats = N //total number of seats

<Customer>

while(true) { //runs in an infinite loop

SemWait(accessSeats) //tries to get access to the chairs

if ( NumberOfFreeSeats > 0 ) { //if there are any free seats

NumberOfFreeSeats-- //sitting down on a chair

SemSignal(Customers) //notify the barber, who's waiting that there is a customer

SemSignal(accessSeats) //don't need to lock the chairs anymore

SemWait(Barber) //now it's this customer's turn, but wait if the barber is busy

//here the customer is having his hair cut

} else { //there are no free seats

//tough luck

SemSignal(accessSeats) //but don't forget to release the lock on the seats

//customer leaves without a haircut

}

}

<Barber>

while(true) { //runs in an infinite loop

//tries to acquire a customer - if none is available he goes to sleep

SemWait(Customers)

//at this time he has been awakened - want to modify the number of available seats

SemWait(accessSeats)

NumberOfFreeSeats++ //one chair gets free

SemSignal(Barber) //the barber is ready to cut

SemSignal(accessSeats) //we don't need the lock on the chairs anymore

//here the barber is cutting hair

}

Solution for Building H2O Problem:

mutex = Semaphore(1)

oxygen = 0

hydrogen = 0

oxyQueue = Semaphore(0)

hydroQueue = Semaphore(0)

<Oxygen>

1 mutex.wait()

2 oxygen += 1

3 if hydrogen >= 2:

4 hydroQueue.signal()

5 hydroQueue.signal()

6 hydrogen -= 2

7 oxyQueue.signal()

8 oxygen -= 1

9 else

10 mutex.signal()

11

12 oxyQueue.wait()

13 bond()

14 mutex.signal()

<Hydrogen>

1 mutex.wait()

2 hydrogen += 1

3 if hydrogen >= 2 and oxygen >= 1:

4 hydroQueue.signal()

5 hydroQueue.signal()

6 hydrogen -= 2

7 oxyQueue.signal()

8 oxygen -= 1

9 else

10 mutex.signal()

11

12 hydroQueue.wait()

13 bond()

Solution for the dining savages problem:

servings = 0

mutex = Semaphore(1)

emptyPot = Semaphore(0)

fullPot = Semaphore(0)

<Cook>

1 while true:

2 emptyPot.wait()

3 putServingsInPot(M)

4 fullPot.signal()

<Savage>

1 while true:

2 mutex.wait()

3 if servings == 0:

4 emptyPot.signal()

5 fullPot.wait()

6 servings = M

7 servings -= 1

8 getServingFromPot()

9 mutex.signal()

10

11 eat()