FRunnable

适用于复杂运算

class FSimpleRunnable: public FRunnable
{
public:
	FSimpleRunnable(const FString& _ThreadName);
	~FSimpleRunnable();
private:
	FString ThreadName;
	FRunnableThread* ThreadIns;
	
	virtual bool Init() override;
	virtual uint32 Run() override;
	virtual void Stop() override;
	virtual void Exit() override;
};

关于线程优先级,从高到低

enum EThreadPriority
{
    TPri_TimeCritical,
    TPri_Highest,
    TPri_AboveNormal,   
    TPri_Normal,
    TPri_SlightlyBelowNormal,
    TPri_BelowNormal,
    TPri_Lowest,
}

在构造函数中直接创建线程

// .cpp
FSimpleRunnable::FSimpleRunnable(const FString& ThreadName)
{
	ThreadName = _ThreadName;
	ThreadIns = FRunnableThread::Create(this, *ThreadName, 0, TPri_Normal);
}

FSimpleRunnable::~FSimpleRunnable()
{
//线程取消时的操作
}

bool FSimpleRunnable::Init()
{
	return true; //若返回 false ,线程创建失败,不会执行后续函数
}

uint32 FSimpleRunnable::Run()
{
//线程执行
	return 0;
}

void FSimpleRunnable::Stop()
{
 //线程暂停
}

void FSimpleRunnable::Exit()
{
  //线程退出
	UE_LOG(LogTemp, Warning, TEXT("Thread Exit!"));
}

AsyncTask

ENamedThreads::GameThread 游戏主线程
ENamedThreads::ActualRenderingThread 实际渲染线程,有时在主线程,有时在实际渲染线程
ENamedThreads::AnyThread 任意线程

AsyncTask(ENamedThreads::GameThread, [=]()
    {    
    //线程运行,可以便捷的使用多线程,我使用它在子线程中调用主线程
    });

线程锁 FScopeLock

声明一个线程锁

FCriticalSection CS;

使用FScopeLock管理线程锁,自动处理锁定与解锁

 <code>
 {
 	// 同步对以下数据的线程访问
 		FScopeLock ScopeLock(&CS);
 	// 访问多个线程之间共享的数据
 	...
 	// 当ScopeLock超出范围时,其他线程可以访问数据
 }
 </code>

直接用FCriticalSection处理

CS->Lock();//锁定
CS->UnLock();//解锁
CS->TryLock();//尝试锁定,如果成功锁定,返回true,如果已被锁定,返回false

TaskGraph

太麻烦了,以后再说