UE5 FSpinlock如何使用?请用代码详细说明
UE5中的FSpinLock是一个自旋锁,用于在多线程环境中保护共享资源的并发访问。下面是一个使用FSpinLock的简单示例代码:
#include "CoreMinimal.h"
#include "Containers/Array.h"
#include "HAL/ThreadSafeBool.h"
#include "HAL/RunnableThread.h"
// 共享资源
TArray<int32> SharedData;
FSpinLock SharedDataLock;
// 线程函数
uint32 ThreadFunc(void* Param)
{
int32 ThreadIndex = *static_cast<int32*>(Param);
// 在共享资源上加锁
FScopeLock Lock(&SharedDataLock);
// 修改共享资源
SharedData.Add(ThreadIndex);
// 打印线程索引和共享资源内容
UE_LOG(LogTemp, Warning, TEXT("Thread %d: Shared Data: %s"), ThreadIndex, *FString::Join(SharedData, TEXT(",")));
// 解锁共享资源
Lock.Unlock();
return 0;
}
// 入口函数
void RunSpinLockExample()
{
// 创建两个线程
FRunnableThread* Thread1 = FRunnableThread::Create(&ThreadFunc, new int32(1), TEXT("Thread1"));
FRunnableThread* Thread2 = FRunnableThread::Create(&ThreadFunc, new int32(2), TEXT("Thread2"));
// 等待线程完成
Thread1->WaitForCompletion();
Thread2->WaitForCompletion();
}
在上面的示例中,我们首先定义了一个用于存储共享数据的TArray
然后,我们定义了一个线程函数ThreadFunc,在其中使用FScopeLock对SharedDataLock进行加锁,并修改SharedData。在加锁期间,其他线程会被阻塞,直到当前线程释放锁。
最后,在RunSpinLockExample函数中创建了两个线程,并等待它们完成执行。
需要注意的是,在实际应用中,我们可能需要更加细致地控制共享资源的访问顺序,以避免死锁和竞争条件等问题。在使用FSpinLock时,一定要小心处理锁的获取和释放,以确保线程安全性
原文地址: https://www.cveoy.top/t/topic/hzPu 著作权归作者所有。请勿转载和采集!