zoukankan      html  css  js  c++  java
  • 信号量的实现

    class OSCond
    {
    public:

        OSCond();
        ~OSCond();

        inline void     Signal();
        inline void     Wait(OSMutex* inMutex, SInt32 inTimeoutInMilSecs = 0);
        inline void     Broadcast();

    private:

    #ifdef __Win32__
        HANDLE              fCondition;
        UInt32              fWaitCount;
    #elif __PTHREADS_MUTEXES__
        pthread_cond_t      fCondition;
        void                TimedWait(OSMutex* inMutex, SInt32 inTimeoutInMilSecs);
    #else
        mycondition_t       fCondition;
    #endif
    };

    inline void OSCond::Wait(OSMutex* inMutex, SInt32 inTimeoutInMilSecs)
    {
    #ifdef __Win32__
        DWORD theTimeout = INFINITE;
        if (inTimeoutInMilSecs > 0)
            theTimeout = inTimeoutInMilSecs;
        inMutex->Unlock();
        fWaitCount++;
        DWORD theErr = ::WaitForSingleObject(fCondition, theTimeout);
        fWaitCount--;
        Assert((theErr == WAIT_OBJECT_0) || (theErr == WAIT_TIMEOUT));
        inMutex->Lock();
    #elif __PTHREADS_MUTEXES__
        this->TimedWait(inMutex, inTimeoutInMilSecs);
    #else
        Assert(fCondition != NULL);
        mycondition_wait(fCondition, inMutex->fMutex, inTimeoutInMilSecs);
    #endif
    }

    inline void OSCond::Signal()
    {
    #ifdef __Win32__
        BOOL theErr = ::SetEvent(fCondition);
        Assert(theErr == TRUE);
    #elif __PTHREADS_MUTEXES__
        pthread_cond_signal(&fCondition);
    #else
        Assert(fCondition != NULL);
        mycondition_signal(fCondition);
    #endif
    }

    inline void OSCond::Broadcast()
    {
    #ifdef __Win32__
        //
        // There doesn't seem like any more elegant way to
        // implement Broadcast using events in Win32.
        // This will work, it may generate spurious wakeups,
        // but condition variables are allowed to generate
        // spurious wakeups
        UInt32 waitCount = fWaitCount;
        for (UInt32 x = 0; x < waitCount; x++)
        {
            BOOL theErr = ::SetEvent(fCondition);
            Assert(theErr == TRUE);
        }
    #elif __PTHREADS_MUTEXES__
        pthread_cond_broadcast(&fCondition);
    #else
        Assert(fCondition != NULL);
        mycondition_broadcast(fCondition);
    #endif
    }

    #endif //_OSCOND_H_

  • 相关阅读:
    Redis作者谈Redis应用场景(转)
    程序员必读书籍及导读指南(转)
    Python迭代器包itertools(转)
    Flash 0day漏洞(CVE-2018-4878)复现
    第二届“强网杯”全国网络安全挑战赛来袭——线上赛
    网站漏洞——文件判断函数的安全风险(实战篇)
    Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
    【python入门】之教你编写自动获取金币脚本
    Python大法之从火车余票查询到打造抢Supreme神器
    读DEDECMS找后台目录有感
  • 原文地址:https://www.cnblogs.com/cnhk19/p/13162641.html
Copyright © 2011-2022 走看看