首先,了解一下该系统重要的数据类型.
1.
FQueuedThreadPool:虚基类,队列线程池,
FQueuedThreadPoolBase继承自FQueuedThreadPool,
FQueuedThreadPoolBase维护了一个
TArray<IQueuedWork*> QueuedWork
(需要被执行的工作),
TArray<FQueuedThread*> AllThreads
(所 有的线程)
TArray<FQueuedThread*> QueuedThreads ( 空闲的线程)
2.
FQueuedThread继承自
FRunnable, 代表了线程的执行体,但并非线程本身。一个线程创建后将会执行FRunnable的Run()函数.
3.
FRunnableThread代表了线程本身,该类会派生出平台相关的子类,win32下对应的是
FRunnableThreadWin,建议读者看看某个平台下的具体实 现。在
创建时需要指定一个FRunnable,用于线程执行。
4. FEvent: 虚基类,提供了事件操作的接口,用于线程的激活挂起, 该类会派生出平台相关的子类,win32下对应的是
FEventWin。
两个重要接口: Wait()将会使线程挂起,
Trigger()将会激活线程,配对使用。
了解了相关的数据类型后,可以开始剖析多线程任务系统的流程了,先从AsyncWork.h开始。
AsyncWork.h中有几个使用多线程任务系统的例子,先来了解我们如何使用多线程来执行任务。
大体流程如下:
先自定义一个任务类,用于执行我们的任务
class ExampleAutoDeleteAsyncTask : public FNonAbandonableTask
{
friend class FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>;
//核心接口,
这里便是任务的具体执行内容.
void DoWork()
{