thread/thread.cc
A glibmm thread example.
00001 00002 #include <iostream> 00003 #include <queue> 00004 #include <glibmm/random.h> 00005 #include <glibmm/thread.h> 00006 #include <glibmm/timer.h> 00007 00008 00009 namespace 00010 { 00011 00012 class MessageQueue : public sigc::trackable 00013 { 00014 public: 00015 MessageQueue(); 00016 ~MessageQueue(); 00017 00018 void producer(); 00019 void consumer(); 00020 00021 private: 00022 Glib::Mutex mutex_; 00023 Glib::Cond cond_push_; 00024 Glib::Cond cond_pop_; 00025 std::queue<int> queue_; 00026 }; 00027 00028 00029 MessageQueue::MessageQueue() 00030 {} 00031 00032 MessageQueue::~MessageQueue() 00033 {} 00034 00035 void MessageQueue::producer() 00036 { 00037 Glib::Rand rand (1234); 00038 00039 for(int i = 0; i < 200; ++i) 00040 { 00041 { 00042 Glib::Mutex::Lock lock (mutex_); 00043 00044 while(queue_.size() >= 64) 00045 cond_pop_.wait(mutex_); 00046 00047 queue_.push(i); 00048 std::cout << '*'; 00049 std::cout.flush(); 00050 00051 cond_push_.signal(); 00052 } 00053 00054 if(rand.get_bool()) 00055 continue; 00056 00057 Glib::usleep(rand.get_int_range(0, 100000)); 00058 } 00059 } 00060 00061 void MessageQueue::consumer() 00062 { 00063 Glib::Rand rand (4567); 00064 00065 for(;;) 00066 { 00067 { 00068 Glib::Mutex::Lock lock (mutex_); 00069 00070 while(queue_.empty()) 00071 cond_push_.wait(mutex_); 00072 00073 const int i = queue_.front(); 00074 queue_.pop(); 00075 std::cout << "\x08 \x08"; 00076 std::cout.flush(); 00077 00078 cond_pop_.signal(); 00079 00080 if(i >= 199) 00081 break; 00082 } 00083 00084 if(rand.get_bool()) 00085 continue; 00086 00087 Glib::usleep(rand.get_int_range(10000, 200000)); 00088 } 00089 } 00090 00091 } 00092 00093 00094 int main(int, char**) 00095 { 00096 Glib::thread_init(); 00097 00098 MessageQueue queue; 00099 00100 Glib::Thread *const producer = Glib::Thread::create( 00101 sigc::mem_fun(queue, &MessageQueue::producer), true); 00102 00103 Glib::Thread *const consumer = Glib::Thread::create( 00104 sigc::mem_fun(queue, &MessageQueue::consumer), true); 00105 00106 producer->join(); 00107 consumer->join(); 00108 00109 std::cout << std::endl; 00110 00111 return 0; 00112 } 00113