FScopeLock 是 UE 中处理多线程同步的简单而高效的工具,通过 “作用域自动加锁 / 解锁” 的特性,确保共享资源的线程安全,同时减少死锁风险。在涉及多线程访问共享数据(如对象池、全局缓存、配置表)时,FScopeLock 是首选的同步方式。

 

1. 定义临界区

首先需要定义一个 FCriticalSection 对象(临界区),作为线程同步的 “锁”:
// 在类中声明临界区(通常是私有成员)
FCriticalSection MyCriticalSection;

// 共享资源(需要保护的数据)
TArray<int32> SharedData;


2. 使用 FScopeLock 保护共享资源

在访问或修改共享资源的代码块中,创建 FScopeLock 对象,传入临界区:
 
void AddData(int32 NewValue)
{
    // 构造FScopeLock,自动对MyCriticalSection加锁
    FScopeLock Lock(&MyCriticalSection);
    
    // 访问共享资源(此时只有当前线程能执行这段代码)
    SharedData.Add(NewValue);
    
    // 当Lock超出作用域(函数结束),析构函数自动解锁
}

int32 GetDataCount()
{
    FScopeLock Lock(&MyCriticalSection);
    return SharedData.Num(); // 安全读取共享资源
}
posted on 2025-08-07 10:38  偷懒的阿贤  阅读(22)  评论(0)    收藏  举报