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_

  • 相关阅读:
    查看文件 ls -lh
    java Dom4j xml 写
    centos tar 常用
    os && shutil 模块
    Visual Studio
    ssh 无法登陆
    find 命令
    Centos7 安装redis
    zerorpc
    uwsgi
  • 原文地址:https://www.cnblogs.com/cnhk19/p/13162641.html
Copyright © 2011-2022 走看看