⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
// Copyright (C) 2001-2003// William E. Kempf////  Distributed under the Boost Software License, Version 1.0. (See accompanying //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#include <vector>#include <iostream>#include <boost/thread/condition.hpp>#include <boost/thread/mutex.hpp>#include <boost/thread/recursive_mutex.hpp>#include <boost/thread/thread.hpp>namespace {const int ITERS = 100;boost::mutex io_mutex;} // namespacetemplate <typename M>class buffer_t{public:    typedef typename M::scoped_lock scoped_lock;    buffer_t(int n)        : p(0), c(0), full(0), buf(n)    {    }    void send(int m)    {        scoped_lock lk(mutex);        while (full == buf.size())            cond.wait(lk);        buf[p] = m;        p = (p+1) % buf.size();        ++full;        cond.notify_one();    }    int receive()    {        scoped_lock lk(mutex);        while (full == 0)            cond.wait(lk);        int i = buf[c];        c = (c+1) % buf.size();        --full;        cond.notify_one();        return i;    }    static buffer_t& get_buffer()    {        static buffer_t buf(2);        return buf;    }    static void do_sender_thread()    {        for (int n = 0; n < ITERS; ++n)        {            {                boost::mutex::scoped_lock lock(io_mutex);                std::cout << "sending: " << n << std::endl;            }            get_buffer().send(n);        }    }    static void do_receiver_thread()    {        for (int x=0; x < (ITERS/2); ++x)        {            int n = get_buffer().receive();            {                boost::mutex::scoped_lock lock(io_mutex);                std::cout << "received: " << n << std::endl;            }        }    }private:    M mutex;    boost::condition cond;    unsigned int p, c, full;    std::vector<int> buf;};template <typename M>void do_test(M* dummy=0){    typedef buffer_t<M> buffer_type;    buffer_type::get_buffer();    boost::thread thrd1(&buffer_type::do_receiver_thread);    boost::thread thrd2(&buffer_type::do_receiver_thread);    boost::thread thrd3(&buffer_type::do_sender_thread);    thrd1.join();    thrd2.join();    thrd3.join();}void test_buffer(){    do_test<boost::mutex>();    do_test<boost::recursive_mutex>();}int main(){    test_buffer();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -