// // A thread demo in C++ using the thread facility defined in the C++-11 // standard. The layout is much like pthreads, but the interface is much // cleaner. As the other thread examples, the main declares a certain amount of // "resources" (just an integer number) then starts two threads which // "work through" the resources (mostly by printing that they did). // #include #include #include #include #include // This is for the Unix gitpid() used for randomization. It has nothing to do // with the C++-11 threading. #include using std::string; using std::cout; using std::endl; /* Shared data. */ int depot; /* Used tosynchronize access to the resource depot. */ std::mutex depot_sync; /* Thread function. Takes a string to print and range for the random number generator for the number of resources used. */ void thbod(string topr, int low, int high) { while(1) { /* Choose a random number in range. */ int amt = rand() % (high - low + 1) + low; /* Acquire the lock and obtain needed resource. */ depot_sync.lock(); if(depot < amt) amt = depot; depot -= amt; depot_sync.unlock(); /* When the resource is exhausted, we're done. */ if(amt == 0) return; /* Do that much "work." */ while(amt--) { cout << "[" << topr << "]"; cout.flush(); } cout << endl; } } /* Main starts two threads and waits for them to end. */ main() { /* Seed the random number generator to vary behavior. */ srand(time(0) ^ 387*getpid()); /* Create the threads. Both start running thbod, and finish when the function returns. The depot provides resources for the the threads to run. */ depot = 3000; /* Two thread objects. These declarations both create the objects and call the indicated function (thbod in both cases) in a new thread of control. */ std::thread th1(thbod, "Z", 14, 18); std::thread th2(thbod, "EE", 8, 12); /* Wait for each of them to be done. */ th1.join(); cout << "First Done" << endl; th2.join(); cout << "Second Done" << endl; }