diff --git a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp index 25ece4b8..a195500f 100644 --- a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp +++ b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp @@ -54,7 +54,7 @@ CVoid GDynamicEngine::commonRunAll() { * 2. 在element执行完成之后,进行裂变,直到所有的element执行完成 * 3. 等待异步执行结束 */ - finished_end_size_ = 0; + finished_end_size_.store(0, std::memory_order_release); for (auto* element : front_element_arr_) { process(element, element == front_element_arr_.back()); } @@ -185,8 +185,9 @@ CVoid GDynamicEngine::afterElementRun(GElementPtr element) { break; case internal::GElementShape::TAIL: { - CGRAPH_LOCK_GUARD lock(locker_.mtx_); - if ((++finished_end_size_ >= total_end_size_)) { + const auto curEndSize = finished_end_size_.fetch_add(1, std::memory_order_acq_rel) + 1; + if (curEndSize == total_end_size_) { + CGRAPH_LOCK_GUARD lock(locker_.mtx_); locker_.cv_.notify_one(); } } @@ -210,7 +211,7 @@ CVoid GDynamicEngine::fatWait() { * 1,执行结束 * 2,状态异常 */ - return (finished_end_size_ >= total_end_size_) || cur_status_.isErr(); + return (finished_end_size_.load(std::memory_order_acquire) >= total_end_size_) || cur_status_.isErr(); }); } diff --git a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h index 70ca094d..92dd02d3 100644 --- a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h +++ b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h @@ -107,11 +107,10 @@ class GDynamicEngine : public GEngine { GElementPtrArr total_element_arr_ {}; // pipeline中所有的元素信息集合 GElementPtrArr front_element_arr_ {}; // 没有依赖的元素信息 CSize total_end_size_ = 0; // 图结束节点数量 - CSize finished_end_size_ = 0; // 执行结束节点数量 - CStatus cur_status_; // 当前全局的状态信息 - std::atomic parallel_run_num_ {0}; // 纯并行时,执行的个数信息 + std::atomic finished_end_size_ {0}; // 执行结束节点数量 + CStatus cur_status_ {}; // 当前全局的状态信息 + std::atomic parallel_run_num_ {0}; // 纯并行时,执行的个数信息 GElementPtrMat2D parallel_element_matrix_ {}; // 纯并行时,记录分解后的数据 - internal::GEngineDagType dag_type_ = { internal::GEngineDagType::COMMON }; // 当前元素的排布形式 UCvMutex locker_; @@ -122,4 +121,4 @@ class GDynamicEngine : public GEngine { CGRAPH_NAMESPACE_END -#endif // CGRAPH_GDYNAMICENGINE_H \ No newline at end of file +#endif // CGRAPH_GDYNAMICENGINE_H