HappyTree的专栏

心态决定人生

用户操作
[即时聊天] [发私信] [加为好友]
许玉亮ID:HappyTree
34595次访问,排名3377好友0人,关注者2
计算机软件行业,爱好乒乓球
HappyTree的文章
原创 71 篇
翻译 0 篇
转载 28 篇
评论 31 篇
HappyTree的公告
生于赣南,长于乡野,逐于学途,蜗居都市。少时苦读,但未成材;及入大学,懵懂四年。误学地理,却喜远足。及脱苦海,幸中硕士,始触电脑;三年猛醒,方得糊口之技。闲时喜乒乓,不得其法。书无所不读,不求甚解。闲静少言,不慕荣利。胸无点墨,心无城府。做事待人皆认真,往往吃亏,亦不后悔。
最近评论
hanyubie:看着你们都有所成就,很羡慕,我明年才毕业,未来的路很迷茫。
QQ5460QQ:老兄,搞错了,编译通过,感觉非常捧!
QQ5460QQ:老兄,这个程序你运行过了没有,在vs.net 2005下面,怎么就死掉了.
icbm:oracle 10g有了精简的客户端,称为instantclient。
复制到机器上,加两个环境变量就可以了用了。
很方便。大小为30M,oracle官方网站有下载的。
lynx1111:写得不错。支持!
请参考: http://www.mydwbi.com/forums/show/3.page
文章分类
收藏
    相册
    精彩博客
    C++的罗浮宫
    Cookbook
    云风的BLOG
    周星星
    孟岩
    旁观者 - 郑昀
    许式伟的专栏
    负暄琐话
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 生产者-消费者模型收藏

    新一篇: 巨整数相乘的简单实现 | 旧一篇: 打印一首唐诗的N种实现之六:内存修改

     
    最近多次看到大家在讨论生产者-消费者模型,觉得使用信号量是最简单的,但效率上可能会有些影响,因为每次对消息的操作都要从用户态转到内核态。
    什么是生产者-消费者模型,即多个模块产生数据,另外多个模块取得数据并进行处理。如何实现互斥?如何让生产者和消费者都能够方便的工作?
    本设计的主要特色为:
    ·消息的大小、结构是自由的,甚至可以是一个对象;
    ·消息队列的长度(容纳消息的个数)是可设定的;
    ·添加消息是阻塞的,即如果队列已满,不能再添加消息;
    ·代码少,思路简洁,可以根据情况扩展.
    以下是该模型的实现:
    template <class T> 
    class PCM_SEM
    {
    public:
        
    // constructor
        PCM_SEM(int nSize)
        
    {
            InitializeCriticalSection(
    &m_csLock);
            _ASSERT(m_hPushSemaphore 
    = CreateSemaphore(NULL, nSize, nSize, NULL));
            _ASSERT(m_hPopSemaphore 
    = CreateSemaphore(NULL, 0, nSize, NULL));
        }


        
    // destructor
        ~PCM_SEM()
        
    {
            m_listUserData.clear();
            CloseHandle(m_hPopSemaphore);
            CloseHandle(m_hPushSemaphore);
            DeleteCriticalSection(
    &m_csLock);
        }


        
    // wait for the semaphore to add the msg
        void Push(T& t)
        
    {
            _ASSERT(WaitForSingleObject(m_hPushSemaphore, INFINITE) 
    == WAIT_OBJECT_0);
            EnterCriticalSection(
    &m_csLock);
            m_listUserData.push_back(t);
            ReleaseSemaphore(m_hPopSemaphore, 
    1, NULL);
            LeaveCriticalSection(
    &m_csLock);
        }


        
    // wait for the semaphore to get the msg
        T Pop()
        
    {
            _ASSERT(WaitForSingleObject(m_hPopSemaphore, INFINITE) 
    == WAIT_OBJECT_0);
            EnterCriticalSection(
    &m_csLock);
            T t 
    = m_listUserData.front();
            m_listUserData.pop_front();
            ReleaseSemaphore(m_hPushSemaphore, 
    1, NULL);
            LeaveCriticalSection(
    &m_csLock);
            
    return t;
        }


    private:
        CRITICAL_SECTION m_csLock; 
        HANDLE   m_hPopSemaphore;
        HANDLE   m_hPushSemaphore;
        list
    <T>  m_listUserData;
    }
    ;

    下面是该模型的使用:

    const int SIZE_BUFFER = 100;

    PCM_SEM
    <int> pcmData(SIZE_BUFFER);

    unsigned __stdcall Producer(LPVOID lpPara)
    {
        
    int i = 0;
        
    for ( ; ; )
        
    {
            i
    ++;
            stringstream ss;
            ss 
    << "Produce No. " << i << " Product!" << endl;
            cout 
    << ss.str();
            pcmData.Push(i);
            Sleep(
    10);
        }


        
    return 0;
    }


    unsigned __stdcall Consumer(LPVOID lpPara)
    {
        
    for ( ; ; )
        
    {
            stringstream ss;
            ss 
    << "Consume No. " << pcmData.Pop() << " Product!" << endl;
            cout 
    << ss.str();
            Sleep(
    50);
        }


        
    return 0;
    }


    int main(int argc, char* argv[])
    {
        
    if (_beginthreadex(NULL, 0&Producer, NULL, 0, NULL) == NULL) 
        
    {
            
    return -1;
        }


        
    if (_beginthreadex(NULL, 0&Consumer, NULL, 0, NULL) == NULL) 
        
    {
            
    return -1;
        }


        
    return getchar();
    }

    发表于 @ 2007年01月02日 21:28:00|评论(loading...)|编辑

    新一篇: 巨整数相乘的简单实现 | 旧一篇: 打印一首唐诗的N种实现之六:内存修改

    评论

    #QQ5460QQ 发表于2008-07-04 18:15:21  IP: 58.60.231.*
    老兄,这个程序你运行过了没有,在vs.net 2005下面,怎么就死掉了.
    #QQ5460QQ 发表于2008-07-08 16:56:35  IP: 58.60.231.*
    老兄,搞错了,编译通过,感觉非常捧!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © HappyTree