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