UE4/5C++多线程插件制作(六、添加同步线程接口,对MTPManage进行加锁,确保线程安全,到目前为止的全部代码)
发布人:shili8
发布时间:2025-01-12 21:35
阅读次数:0
**UE4/5 C++ 多线程插件制作(六)**
在前面的章节中,我们已经完成了多线程插件的基本结构、线程池管理器的实现以及任务管理器的设计。然而,到目前为止,我们还没有对 MTPManage 进行加锁,以确保线程安全。
**添加同步线程接口**
为了解决这个问题,我们需要在 MTPManage 中添加一个同步线程接口。这个接口将负责在多线程环境下保护共享资源的访问。
首先,让我们创建一个新的 C++ 类,名为 `MTPSync`:
cpp// MTPSync.h#pragma once#include "CoreMinimal.h" #include "Engine/Classes/Engine/ThreadSafe.h" class FMTPSync{ public: static FMTPSync& Get(); void Lock(); void Unlock(); private: FMTPSync() {} ~FMTPSync() {} static FMTPSync* Instance; };
cpp// MTPSync.cpp#include "MTPSync.h" FMTPSync* FMTPSync::Instance = nullptr; FMTPSync& FMTPSync::Get() { if (!Instance) { Instance = new FMTPSync(); } return *Instance; } void FMTPSync::Lock() { // 使用 UE4 的 ThreadSafe 类来实现锁定 ThreadSafe::Lock(); } void FMTPSync::Unlock() { // 使用 UE4 的 ThreadSafe 类来实现解锁 ThreadSafe::Unlock(); }
**对 MTPManage 进行加锁**
现在,我们需要在 MTPManage 中使用 `MTPSync` 来进行加锁和解锁。我们将在 `MTPManage` 的构造函数中添加一个 `MTPSync` 对象,并在关键的方法中使用 `Lock()` 和 `Unlock()` 方法来保护共享资源。
cpp// MTPManage.h#pragma once#include "CoreMinimal.h" #include "Engine/Classes/Engine/ThreadSafe.h" class FMTPManage{ public: FMTPManage(); ~MTPManage(); void AddTask(FMTPTask* Task); void RemoveTask(FMTPTask* Task); private: MTPSync Sync; };
cpp// MTPManage.cpp#include "MTPManage.h" FMTPManage::FMTPManage() { // 在构造函数中添加一个 MTPSync 对象 Sync = FMTPSync::Get(); } FMTPManage::~MTPManage() { // 在析构函数中释放 MTPSync 对象 delete &Sync; } void FMTPManage::AddTask(FMTPTask* Task) { // 使用 Lock() 方法来保护共享资源的访问 Sync.Lock(); // 添加任务代码 // 使用 Unlock() 方法来解锁 Sync.Unlock(); } void FMTPManage::RemoveTask(FMTPTask* Task) { // 使用 Lock() 方法来保护共享资源的访问 Sync.Lock(); // 移除任务代码 // 使用 Unlock() 方法来解锁 Sync.Unlock(); }
**到目前为止的全部代码**
以下是完整的代码:
cpp// MTPSync.h#pragma once#include "CoreMinimal.h" #include "Engine/Classes/Engine/ThreadSafe.h" class FMTPSync{ public: static FMTPSync& Get(); void Lock(); void Unlock(); private: FMTPSync() {} ~FMTPSync() {} static FMTPSync* Instance; }; // MTPSync.cpp#include "MTPSync.h" FMTPSync* FMTPSync::Instance = nullptr; FMTPSync& FMTPSync::Get() { if (!Instance) { Instance = new FMTPSync(); } return *Instance; } void FMTPSync::Lock() { // 使用 UE4 的 ThreadSafe 类来实现锁定 ThreadSafe::Lock(); } void FMTPSync::Unlock() { // 使用 UE4 的 ThreadSafe 类来实现解锁 ThreadSafe::Unlock(); }
cpp// MTPManage.h#pragma once#include "CoreMinimal.h" #include "Engine/Classes/Engine/ThreadSafe.h" class FMTPManage{ public: FMTPManage(); ~MTPManage(); void AddTask(FMTPTask* Task); void RemoveTask(FMTPTask* Task); private: MTPSync Sync; };
cpp// MTPManage.cpp#include "MTPManage.h" FMTPManage::FMTPManage() { // 在构造函数中添加一个 MTPSync 对象 Sync = FMTPSync::Get(); } FMTPManage::~MTPManage() { // 在析构函数中释放 MTPSync 对象 delete &Sync; } void FMTPManage::AddTask(FMTPTask* Task) { // 使用 Lock() 方法来保护共享资源的访问 Sync.Lock(); // 添加任务代码 // 使用 Unlock() 方法来解锁 Sync.Unlock(); } void FMTPManage::RemoveTask(FMTPTask* Task) { // 使用 Lock() 方法来保护共享资源的访问 Sync.Lock(); // 移除任务代码 // 使用 Unlock() 方法来解锁 Sync.Unlock(); }
这就是我们对 MTPManage 进行加锁以确保线程安全的实现。通过使用 `MTPSync` 来保护共享资源的访问,我们可以在多线程环境下保证插件的稳定性和正确性。
**结论**
本章节中,我们完成了对 MTPManage 的加锁,以确保线程安全。在前面的章节中,我们已经实现了多线程插件的基本结构、线程池管理器的设计以及任务管理器的实现。通过这些章节,我们可以看到 UE4/5 C++ 多线程插件制作是一个复杂而有趣的过程。
**参考**
* UE4 文档:[ThreadSafe]( />* UE4 文档:[CoreMinimal.h](