summaryrefslogtreecommitdiff
path: root/examples/thread/thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'examples/thread/thread.cc')
-rw-r--r--examples/thread/thread.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/examples/thread/thread.cc b/examples/thread/thread.cc
new file mode 100644
index 00000000..aaddff92
--- /dev/null
+++ b/examples/thread/thread.cc
@@ -0,0 +1,114 @@
+
+#include <iostream>
+#include <queue>
+#include <sigc++/class_slot.h>
+#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::slot_class(queue, &MessageQueue::producer), true);
+
+ Glib::Thread *const consumer = Glib::Thread::create(
+ SigC::slot_class(queue, &MessageQueue::consumer), true);
+
+ producer->join();
+ consumer->join();
+
+ std::cout << std::endl;
+
+ return 0;
+}
+