This is the final version of the crossing problem program. In the previous week, we pulled much of the code into separate files so that data structures and information could be shared more easily between the multiple executables. This week, the source code was separated even more to allow for 2 shared resource problems to be solved in 1 program (more on this later). More importantly, however, you will find that the signal and wait functions have been put to work to manage the shared resources across 70 car and train processes. Looking over the source code, you will find that the functions used to generate random numbers have been completely overhauled. Rather than having each process attempt to create a unique random number seed, all of the random numbers are now generated by a single process. In effect, random numbers are now a resource created by a single producer and used by several consumers. I recommend that you try to understand the crossing problem before looking at the solution to the random number problem. Just so you know, there are actually a few problems with this method that are not immediately obvious. If you think you spotted one, feel free to zap me an e-mail.