logo top
Main Page   Widgets   Namespaces   Book  

thread/thread.cc

A glibmm thread example.
#include <iostream> #include <queue> #include <glibmm/random.h> #include <glibmm/thread.h> #include <glibmm/timer.h> namespace { class MessageQueue { public: MessageQueue(); ~MessageQueue(); void producer(); void consumer(); private: Glib::Mutex mutex_; Glib::Cond cond_push_; Glib::Cond cond_pop_; std::queue<int> queue_; }; MessageQueue::MessageQueue() {} MessageQueue::~MessageQueue() {} void MessageQueue::producer() { Glib::Rand rand (1234); for(int i = 0; i < 200; ++i) { { Glib::Mutex::Lock lock (mutex_); while(queue_.size() >= 64) cond_pop_.wait(mutex_); queue_.push(i); std::cout << '*'; std::cout.flush(); cond_push_.signal(); } if(rand.get_bool()) continue; Glib::usleep(rand.get_int_range(0, 100000)); } } void MessageQueue::consumer() { Glib::Rand rand (4567); for(;;) { { Glib::Mutex::Lock lock (mutex_); while(queue_.empty()) cond_push_.wait(mutex_); const int i = queue_.front(); queue_.pop(); std::cout << "\x08 \x08"; std::cout.flush(); cond_pop_.signal(); if(i >= 199) break; } if(rand.get_bool()) continue; Glib::usleep(rand.get_int_range(10000, 200000)); } } } int main(int, char**) { Glib::thread_init(); MessageQueue queue; Glib::Thread *const producer = Glib::Thread::create( sigc::mem_fun(queue, &MessageQueue::producer), true); Glib::Thread *const consumer = Glib::Thread::create( sigc::mem_fun(queue, &MessageQueue::consumer), true); producer->join(); consumer->join(); std::cout << std::endl; return 0; }
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 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

Generated for glibmm 2.4 by Doxygen 1.3.7 © 1997-2001