您的位置:首页 > 其它

使用boost条件变量实现消息队列

2015-10-10 09:19 92 查看
    boost
thread库里面没有实现类似java中BlockingQueue的东东。但是使用条件变量来实现一个还是很容易的。下面的代码是以前学习boost
thread库时的练手之作。

==============================================================

#include
<boost/shared_array.hpp>

#include <boost/thread.hpp>

#include <stdexcept>

#include <queue>

class MsgQueue

{

public:

    typedef
boost::shared_array<char>
Msg;

   
MsgQueue(std::size_t
max_size_)

        :
max_size(max_size_)

        , close_flag(false)

    {

        if (max_size <
1)

        {

            throw
std::runtime_error("MsgQueue::MsgQueue
: max_size < 1");

        }

    }

    ~MsgQueue()

    {

        close();   
   

    }

    void push(Msg msg)

    {   

       
boost::mutex::scoped_lock
lock(mtx);

        while (msgs.size()
>= max_size &&
!close_flag)

       
{       
   

           
full_cond.wait(lock);

        }

        if (close_flag)

        {

            throw
std::runtime_error("MsgQueue::push
: msg queue has been shutdown.");

        }

        msgs.push(msg);

        if(msgs.size() == 1)

        {

           
empty_cond.notify_all();   

       
}       

    }

    bool nbPush(Msg msg)

    {

        //   
non-blocking push

       
boost::mutex::scoped_lock
lock(mtx);

        if (msgs.size()
>= max_size || close_flag)

        {

            return
false;

        }

        msgs.push(msg);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: