VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 109|回复: 0

哪位大哥帮看一下这代码的具体作用?

[复制链接]
35_avatar_middle
最佳答案
0 
online_vip 发表于 2020-3-18 09:56:42 | 显示全部楼层 |阅读模式
#define DEFAULT_PAUSE_YIELD                8
#define DEFAULT_PAUSE_CYCLE                4096

class CReentrantSpinGuard
{
public:
        CReentrantSpinGuard()
        : m_dwThreadID        (0)
        , m_iCount                (0)
        {

        }

        ~CReentrantSpinGuard()
        {
                ASSERT(m_dwThreadID        == 0);
                ASSERT(m_iCount                == 0);
        }

        void Lock()
        {
                for(UINT i = 0; !_TryLock(i == 0); ++i)
                        Pause(i);
        }

        BOOL TryLock()
        {
                return _TryLock(TRUE);
        }

        void Unlock()
        {
                ASSERT(m_dwThreadID == ::GetCurrentThreadId());

                if((--m_iCount) == 0)
                        m_dwThreadID = 0;
        }

        static void Pause(UINT i)
        {
                if                (i < DEFAULT_PAUSE_YIELD)                YieldProcessor();
                else if        (i < DEFAULT_PAUSE_CYCLE - 1)        SwitchToThread();
                else if        (i < DEFAULT_PAUSE_CYCLE)                Sleep(1);
                else                                                                        Pause(i & (DEFAULT_PAUSE_CYCLE - 1));
        }

private:
        CReentrantSpinGuard(const CReentrantSpinGuard& cs);
        CReentrantSpinGuard operator = (const CReentrantSpinGuard& cs);

        BOOL _TryLock(BOOL bFirst)
        {
                DWORD dwCurrentThreadID = ::GetCurrentThreadId();

                if(bFirst && m_dwThreadID == dwCurrentThreadID)
                {
                        ++m_iCount;
                        return TRUE;
                }

                if(::InterlockedCompareExchange(&m_dwThreadID, dwCurrentThreadID, 0) == 0)
                {
                        ::_ReadWriteBarrier();
                        ASSERT(m_iCount == 0);

                        m_iCount = 1;

                        return TRUE;
                }

                return FALSE;
        }

private:
        volatile DWORD        m_dwThreadID;
        int                                m_iCount;
};

具体作用,能帮细说一下不?




上一篇:一道链表的题,谢谢大佬
下一篇:关于sql的操作
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-12-2 15:11

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表