A glibmm thread example.
#if defined(_MSC_VER) && (_MSC_VER < 1900)
#include <glibmmconfig.h>
#endif
#include <glibmm/init.h>
#include <glibmm/random.h>
#include <glibmm/timer.h>
namespace
{
class MessageQueue
{
public:
  MessageQueue();
  ~MessageQueue();
  void producer();
  void consumer();
private:
};
MessageQueue::MessageQueue()
{
}
MessageQueue::~MessageQueue()
{
}
void
MessageQueue::producer()
{
  for (auto i = 0; i < 200; ++i)
  {
    {
      cond_pop_.wait(
lock, [
this]() -> 
bool { 
return queue_.size() < 64; });
      queue_.push(i);
      
      
      cond_push_.notify_one();
    }
      continue;
  }
}
void
MessageQueue::consumer()
{
  for (;;)
  {
    {
      cond_push_.wait(
lock, [
this]() -> 
bool { 
return !queue_.empty(); });
      const int i = queue_.front();
      queue_.pop();
      
      
      cond_pop_.notify_one();
      if (i >= 199)
        break;
    }
      continue;
  }
}
}
int
main(int, char**)
{
  MessageQueue queue;
  
  const auto producer =
  const auto consumer =
  producer->join();
  consumer->join();
  return 0;
}