starvephil.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 186 行

CPP
186
字号
// 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 <boost/thread/mutex.hpp>#include <boost/thread/condition.hpp>#include <boost/thread/thread.hpp>#include <boost/thread/xtime.hpp>#include <iostream>#include <time.h>namespace{boost::mutex iomx;} // namespaceclass canteen{public:    canteen() : m_chickens(0) { }    void get(int id)    {        boost::mutex::scoped_lock lock(m_mutex);        while (m_chickens == 0)        {            {                boost::mutex::scoped_lock lock(iomx);                std::cout << "(" << clock() << ") Phil" << id <<                    ": wot, no chickens?  I'll WAIT ..." << std::endl;            }            m_condition.wait(lock);        }        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock() << ") Phil" << id <<                ": those chickens look good ... one please ..." << std::endl;        }        m_chickens--;    }    void put(int value)    {        boost::mutex::scoped_lock lock(m_mutex);        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock()                      << ") Chef: ouch ... make room ... this dish is "                      << "very hot ..." << std::endl;        }        boost::xtime xt;        boost::xtime_get(&xt, boost::TIME_UTC);        xt.sec += 3;        boost::thread::sleep(xt);        m_chickens += value;        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock() <<                ") Chef: more chickens ... " << m_chickens <<                " now available ... NOTIFYING ..." << std::endl;        }        m_condition.notify_all();    }private:    boost::mutex m_mutex;    boost::condition m_condition;    int m_chickens;};canteen g_canteen;void chef(){    const int chickens = 4;    {        boost::mutex::scoped_lock lock(iomx);        std::cout << "(" << clock() << ") Chef: starting ..." << std::endl;    }    for (;;)    {        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock() << ") Chef: cooking ..." << std::endl;        }        boost::xtime xt;        boost::xtime_get(&xt, boost::TIME_UTC);        xt.sec += 2;        boost::thread::sleep(xt);        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock() << ") Chef: " << chickens                      << " chickens, ready-to-go ..." << std::endl;        }        g_canteen.put(chickens);    }}struct phil{    phil(int id) : m_id(id) { }    void run() {        {            boost::mutex::scoped_lock lock(iomx);            std::cout << "(" << clock() << ") Phil" << m_id                      << ": starting ..." << std::endl;        }        for (;;)        {            if (m_id > 0)            {                boost::xtime xt;                boost::xtime_get(&xt, boost::TIME_UTC);                xt.sec += 3;                boost::thread::sleep(xt);            }            {                boost::mutex::scoped_lock lock(iomx);                std::cout << "(" << clock() << ") Phil" << m_id                          << ": gotta eat ..." << std::endl;            }            g_canteen.get(m_id);            {                boost::mutex::scoped_lock lock(iomx);                std::cout << "(" << clock() << ") Phil" << m_id                          << ": mmm ... that's good ..." << std::endl;            }        }    }    static void do_thread(void* param) {        static_cast<phil*>(param)->run();    }    int m_id;};struct thread_adapt{    thread_adapt(void (*func)(void*), void* param)        : _func(func), _param(param)    {    }    int operator()() const    {        _func(_param);        return 0;    }    void (*_func)(void*);    void* _param;};class thread_adapter{public:    thread_adapter(void (*func)(void*), void* param)        : _func(func), _param(param)    {    }    void operator()() const { _func(_param); }private:    void (*_func)(void*);    void* _param;};int main(int argc, char* argv[]){    boost::thread thrd_chef(&chef);    phil p[] = { phil(0), phil(1), phil(2), phil(3), phil(4) };    boost::thread thrd_phil0(thread_adapter(&phil::do_thread, &p[0]));    boost::thread thrd_phil1(thread_adapter(&phil::do_thread, &p[1]));    boost::thread thrd_phil2(thread_adapter(&phil::do_thread, &p[2]));    boost::thread thrd_phil3(thread_adapter(&phil::do_thread, &p[3]));    boost::thread thrd_phil4(thread_adapter(&phil::do_thread, &p[4]));    thrd_chef.join();    thrd_phil0.join();    thrd_phil1.join();    thrd_phil2.join();    thrd_phil3.join();    thrd_phil4.join();    return 0;}

⌨️ 快捷键说明

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