boost 多线程条件变量

来源:互联网 发布:网络聊天工具 编辑:程序博客网 时间:2024/05/12 06:47
#include <boost/thread/thread.hpp>#include <boost/thread/mutex.hpp>#include <boost/thread/condition.hpp>#include <iostream>const int BUF_SIZE = 10 ;const int ITERS = 100 ;boost::mutex io_mutex ;class buffer{public:    buffer()    {        p = 0 ;        c = 0 ;        full = 0 ;    }    void put(int m)    {        boost::mutex::scoped_lock lk(m_mutex) ;        if (full == BUF_SIZE)        {            {                boost::mutex::scoped_lock tp_lk(io_mutex) ;                std::cout<<"Buffer is full.Waiting..."<<std::endl ;            }            while (full == BUF_SIZE)            {                m_condition.wait(lk) ;            }        }        buf[p] = m ;        p = (p + 1)%BUF_SIZE ;        ++full ;        m_condition.notify_one() ;    }    int get()    {        boost::mutex::scoped_lock lk(m_mutex) ;        if (full == 0)        {            {                boost::mutex::scoped_lock tp_lk(io_mutex) ;                std::cout<<"Buffer is empty.Waiting..."<<std::endl ;            }            while (full == 0)            {                m_condition.wait(lk) ;            }        }        int i = buf[c] ;        c = (c + 1)%BUF_SIZE ;        --full ;        m_condition.notify_one() ;        return i ;    }private:    boost::mutex m_mutex ;    boost::condition m_condition ;    unsigned int p , c , full ;    int buf[BUF_SIZE] ;};buffer buf;void writer(){    for (int n = 0; n < ITERS; ++n)    {        {            boost::mutex::scoped_lock                lock(io_mutex);            std::cout << "sending: "                << n << std::endl;        }        buf.put(n);    }}void reader(){    for (int x = 0; x < ITERS; ++x)    {        int n = buf.get();        {            boost::mutex::scoped_lock                lock(io_mutex);            std::cout << "received: "                << n << std::endl;        }    }}int main(int argc, char* argv[]){    boost::thread thrd1(&reader);    boost::thread thrd2(&writer);    thrd1.join();    thrd2.join();    return 0;}// #include <boost/thread/thread.hpp>// #include <boost/thread/mutex.hpp>// #include <boost/thread/condition.hpp>// #include <iostream>// const int BUF_SIZE = 10;// const int ITERS = 100;// boost::mutex io_mutex;// class buffer// {// public://  typedef boost::mutex::scoped_lock//      scoped_lock;// //  buffer()//      : p(0), c(0), full(0)//  {//  }// //  void put(int m)//  {//      scoped_lock lock(mutex);//      if (full == BUF_SIZE)//      {//          {//              boost::mutex::scoped_lock//                  lock(io_mutex);//              std::cout <<//                  "Buffer is full. Waiting..."//                  << std::endl;//          }//          while (full == BUF_SIZE)//              cond.wait(lock);//      }//      buf[p] = m;//      p = (p+1) % BUF_SIZE;//      ++full;//      cond.notify_one();//  }// //  int get()//  {//      scoped_lock lk(mutex);//      if (full == 0)//      {//          {//              boost::mutex::scoped_lock//                  lock(io_mutex);//              std::cout <<//                  "Buffer is empty. Waiting..."//                  << std::endl;//          }//          while (full == 0)//              cond.wait(lk);//      }//      int i = buf[c];//      c = (c+1) % BUF_SIZE;//      --full;//      cond.notify_one();//      return i;//  }// // private://  boost::mutex mutex;//  boost::condition cond;//  unsigned int p, c, full;//  int buf[BUF_SIZE];// };// buffer buf;// void writer()// {//  for (int n = 0; n < ITERS; ++n)//  {//      {//          boost::mutex::scoped_lock//              lock(io_mutex);//          std::cout << "sending: "//              << n << std::endl;//      }//      buf.put(n);//  }// }// void reader()// {//  for (int x = 0; x < ITERS; ++x)//  {//      int n = buf.get();//      {//          boost::mutex::scoped_lock//              lock(io_mutex);//          std::cout << "received: "//              << n << std::endl;//      }//  }// }// int main(int argc, char* argv[])// {//  boost::thread thrd1(&reader);//  boost::thread thrd2(&writer);//  thrd1.join();//  thrd2.join();//  return 0;// }
0 0
原创粉丝点击