话不多说,直接上代码:
#ifndef _RECURSIVE_SECTION_
#define _RECURSIVE_SECTION_
#include "Common.h"
class CRecursiveSection
{
private:
std::atomic<uint32_t> owner_core; // 锁所有者的核心ID
uint32_t recursion_count; // 递归锁定计数
public:
inline CRecursiveSection():
owner_core(UINT32_MAX), recursion_count(0)
{
}
// 锁定函数 (支持递归)
inline void Enter()
{
const uint32_t current_core = get_core_num();
// 检查是否是当前核心的递归锁定
if( owner_core.load() == current_core )
{
recursion_count++;
return;
}
// 等待直到获取锁
while( true )
{
uint32_t expected = UINT32_MAX;
if( owner_core.compare_exchange_weak(expected, current_core) )
{
recursion_count = 1;
break;
}
// 避免忙等待消耗CPU
sleep_us(1);
}
}
// 解锁函数
inline void Leave()
{
const uint32_t current_core = get_core_num();
// 确保只有锁的拥有者才能解锁
if( owner_core.load() == current_core )
{
// 如果递归计数归零,释放锁
if( -- recursion_count == 0 ) {
owner_core.store(UINT32_MAX);
}
}
}
// 获取递归深度
inline uint32_t GetDepth() const {
return recursion_count;
}
};
#endif