#include <iostream> // for cout, endl
#include <thread> // for C++ thread support
#include "ostreamlock.h" // for CS110 iomanipulators (oslock, osunlock) used to lock down streams
using namespace std;
static void recharge() {
cout << oslock << "I recharge by spending time alone." << endl << osunlock;
}
static const size_t kNumIntroverts = 6;
int main(int argc, char *argv[]) {
cout << "Let's hear from " << kNumIntroverts << " introverts." << endl
thread introverts[kNumIntroverts]; // declare array of empty thread handles
for (thread& introvert: introverts)
introvert = thread(recharge); // move anonymous threads into empty handles
for (thread& introvert: introverts)
introvert.join();
cout << "Everyone's recharged!" << endl;
return 0;
} static void greet(size_t id) {
for (size_t i = 0; i < id; i++) {
cout << oslock << "Greeter #" << id << " says 'Hello!'" << endl << osunlock;
struct timespec ts = {
0, random() % 1000000000
};
nanosleep(&ts, NULL);
}
cout << oslock << "Greeter #" << id << " has issued all of his hellos, "
<< "so he goes home!" << endl << osunlock;
}
static const size_t kNumGreeters = 6;
int main(int argc, char *argv[]) {
srandom(time(NULL));
cout << "Welcome to Greetland!" << endl;
thread greeters[kNumGreeters];
for (size_t i = 0; i < kNumGreeters; i++)
greeters[i] = thread(greet, i + 1);
for (thread& greeter: greeters)
greeter.join();
cout << "Everyone's all greeted out!" << endl;
return 0;
}static const unsigned int kBaseIDNumber = 101;
static const unsigned int kNumAgents = 10;
static const unsigned int kNumTickets = 1000;
static mutex ticketsLock;
static unsigned int remainingTickets = kNumTickets;
static void ticketAgent(size_t id) {
while (true) {
ticketsLock.lock();
if (remainingTickets == 0) break;
remainingTickets--;
cout << oslock << "Agent #" << id << " sold a ticket! (" << remainingTickets
<< " more to be sold)." << endl << osunlock;
ticketsLock.unlock();
if (shouldTakeBreak())
takeBreak();
}
ticketsLock.unlock();
cout << oslock << "Agent #" << id << " notices all tickets are sold, and goes home!"
<< endl << osunlock;
}
int main(int argc, const char *argv[]) {
thread agents[kNumAgents];
for (size_t i = 0; i < kNumAgents; i++)
agents[i] = thread(ticketAgent, kBaseIDNumber + i);
for (thread& agent: agents)
agent.join();
cout << "End of Business Day!" << endl;
}