⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 critsect.cpp

📁 The library provides supports for run-time loaded plugin classes in C++
💻 CPP
字号:
#include "pi/CritSect.h"#include "pi/Atomic.h"#include "pi/Thread.h"#include <assert.h>CritSect::CritSect( bool do_construct ){_CFE_;	if( do_construct ){		m_cnt = 0;		m_thid = 0;	}}void CritSect::Enter( ){_CFE_;    int cnt = AtomicIncrement( &m_cnt );	if( m_thid==(int)piGetThreadId() ){        if( cnt>1 )               return; // Repeated entry        assert( !m_thid );	}	    while( cnt>1 ){        if( !AtomicDecrement(&m_cnt) )        	// If final release for other thread happened when we had temp increase        	m_thid = 0;	        piYield();        cnt = AtomicIncrement(&m_cnt);    }        // Have it    m_thid = piGetThreadId();}void CritSect::Leave( ){_CFE_;    int cnt = AtomicDecrement( &m_cnt );    if( !cnt )        // Thread leaving it        m_thid = 0;    else        // Check not released too many times        assert( cnt>0 );}bool CritSect::TryEnter( ){_CFE_;    int cnt = AtomicIncrement( &m_cnt );	if( m_thid==(int)piGetThreadId() ){        if( cnt>1 )               return true; // Repeated entry        assert( !m_thid );	}	    // Have it    if( cnt==1 ){        m_thid = piGetThreadId();        return true;    }    else{        // Failed        AtomicDecrement( &m_cnt );        return false;    }}

⌨️ 快捷键说明

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