Listing 3 This app reads messages from a queue by using a thread pool
#include <iostream> #include <string> #include <vector> #include <windows.h> HANDLE condition; HANDLE mutex; std::vector < std::string > queue; void thread_entry () { for ( ;; ) { WaitForSingleObject ( mutex, INFINITE ); if ( queue.empty () ) { ReleaseMutex ( mutex ); std::cout << "thread going to sleep" << std::endl; WaitForSingleObject ( condition, INFINITE ); WaitForSingleObject ( mutex, INFINITE ); std::cout << "thread awake" << std::endl; } if ( queue.empty () ) { std::cout << "work queue is empty" << std::endl; ReleaseMutex ( mutex ); continue; } std::string message = queue.back (); queue.pop_back (); ReleaseMutex ( mutex ); std::cout << message << std::endl; Sleep ( 1 ); } } int main () { HANDLE threads[ 3 ]; std::string messages[ 10 ] = { "hello", "goodbye", "test", "check", "one", "two", "james", "way-way", "here", "there" }; mutex = CreateMutex ( NULL, FALSE, NULL ); condition = CreateEvent ( NULL, FALSE, FALSE, NULL ); for ( int i = 3; i > 0; --i ) { threads[ i - 1 ] = CreateThread ( NULL, 0, ( LPTHREAD_START_ROUTINE ) thread_entry, NULL, 0, NULL ); } for ( int index = 10; index > 0; --index ) { WaitForSingleObject ( mutex, INFINITE ); queue.push_back ( messages[ index - 1 ] ); SetEvent ( condition ); ReleaseMutex ( mutex ); } WaitForSingleObject ( threads[ 0 ], INFINITE ); return ( 0 ); }