(Latest revision April 29, 2017)


CS 3750 C++ Concurrent Programming Assignment

  1. For Background: Look over the contents of the directory "ThreadInfo" in our web space. Read the file HiHo.cpp in that directory. It illustrates everything you need to know about using function calls from the pthreads package, and about using the counting and queuing semaphores implemented by the sem.cpp and sem.h files. Make copies of sem.cpp and sem.h for your own use. (Any questions about this can be covered in class.)

  2. Make a copy of the foodPass.cpp program. Read the program header comments in order to figure out what the requirements of a solution are. Read the rest of foodPass.cpp, including all the comments, to gain a better understanding of what is required of you.

  3. Insert declarations and instructions into a copy of the program so that it properly performs the required job.

    You may employ (only) ordinary variables and semaphores, as implemented by sem.cpp and sem.h, to achieve the synchronization of threads.

Errors in concurrent programs tend to be intermittant. They tend to be manifested only under certain timings of events. The random delays in the program will tend to make the timing of events change considerably each time the program is executed. If you run the program several times and check the output you are more likely to find out about possible errors than if you just run the program one time and check the output.

For this assignment, you may work in teams of two (2) people. If you work in a team, make sure that both names are in your comments!

More Discussion of the Assignment

When you think about doing this assignment, assume that the program will execute on a (tightly coupled) multiprocessor. That means all the threads (the server, busser, and all the diners) could run simultaneously on separate CPU's. While this may or may not actually be true, it will help you write code that will work on *any* computing system on which multiple threads can execute concurrently while sharing variables.

A tightly-coupled multiprocessing system can be diagrammed this way:
  CPU     CPU     CPU      CPU     CPU     CPU   CPU    MEMORY
    |       |       |        |       |       |     |    |
 ------------------------------------------------------------ BUS
       |      |       |     |     |     |     |     |     |
     CPU    CPU     CPU   CPU   CPU   CPU   CPU   CPU   CPU
Here we have a RAM memory being shared over a common bus by several CPU's. It is possible that the different CPU's have radically different speeds. Speed can be affected by the inherent power of the CPU, or by the current load on the CPU. Besides that, it is impossible to tell which CPU will be assigned to which thread. And also, each time we run the program, the assignment can be different.

In your program, the mother process creates child threads to be the diners and the food server. Then the mother thread plays the role of the busser. The mother does nothing to direct the server and diners after she creates them.

In general it is a bad idea to create "boss" threads, because the boss too often becomes a bottleneck. When every action has to be approved by a boss, work can only begin as quickly as the boss can approve it. This tends to defeat the purpose of parallel processing.


The general rules for submitting assignments by e-mail are:

Here is the list of things you have to turn in:

  1. On the first due date e-mail a psuedo-code description of the algorithm for your solution (in-line in a copy of the skeleton program). Use this subject line: CS3750Prog2Pcode

  2. On the second due date e-mail a shar file containing:


    Use this subject line: CS3750Prog2Final.
Note that there are no spaces in the subject line given. It is important that you do not insert any spaces. My e-mail address is: john@ishi.csustan.edu.


DUE DATES:

For due dates, see the class schedule.