From a8e5cfe70470967d5c6e907fa1e3a0dd43789edc Mon Sep 17 00:00:00 2001 From: lotva Date: Thu, 4 Jun 2026 19:36:47 +0300 Subject: [PATCH 1/2] fix: prevent pivot race condition --- .../nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp | 3 ++- tasks/nalitov_d_dijkstras_algorithm/stl/src/ops_stl.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp b/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp index f2c4a1ad3a..48b395eb9f 100644 --- a/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp +++ b/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp @@ -61,7 +61,8 @@ class NalitovDDijkstrasAlgorithmSTL : public BaseTask { int worker_slots_{}; std::vector pool_; std::vector shard_results_; - NodeId pivot_{}; + + std::atomic pivot_{}; std::atomic mode_{WorkMode::kParked}; std::atomic shutdown_{false}; diff --git a/tasks/nalitov_d_dijkstras_algorithm/stl/src/ops_stl.cpp b/tasks/nalitov_d_dijkstras_algorithm/stl/src/ops_stl.cpp index 0269a79706..3a634331a4 100644 --- a/tasks/nalitov_d_dijkstras_algorithm/stl/src/ops_stl.cpp +++ b/tasks/nalitov_d_dijkstras_algorithm/stl/src/ops_stl.cpp @@ -124,7 +124,7 @@ void NalitovDDijkstrasAlgorithmSTL::PartitionScanBest(int slot) { } void NalitovDDijkstrasAlgorithmSTL::PartitionPushDist(int slot) { - const auto hub = static_cast(pivot_); + const auto hub = static_cast(pivot_.load(std::memory_order_acquire)); const auto &bundle = graph_[hub]; const std::size_t m = bundle.size(); if (m == 0) { @@ -218,6 +218,7 @@ bool NalitovDDijkstrasAlgorithmSTL::PreProcessingImpl() { shutdown_.store(false, std::memory_order_relaxed); mode_.store(WorkMode::kParked, std::memory_order_relaxed); + pivot_.store(-1, std::memory_order_relaxed); const int total_parties = worker_slots_ + 1; bar_start_ = std::make_unique>(total_parties); @@ -252,8 +253,10 @@ bool NalitovDDijkstrasAlgorithmSTL::RunImpl() { if (!ReduceShardResults(shard_results_, worker_slots_, &pick_c, &pick_v)) { break; } + visited_[static_cast(pick_v)] = 1; - pivot_ = pick_v; + pivot_.store(pick_v, std::memory_order_release); + std::atomic_thread_fence(std::memory_order_release); mode_.store(WorkMode::kPushDist, std::memory_order_release); bar_start_->arrive_and_wait(); From c4a6166dc87c54a759b7d6d28f65787d70b131e8 Mon Sep 17 00:00:00 2001 From: lotva Date: Thu, 4 Jun 2026 21:24:22 +0300 Subject: [PATCH 2/2] style: fix warnings --- tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp b/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp index 48b395eb9f..cc1c80ba95 100644 --- a/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp +++ b/tasks/nalitov_d_dijkstras_algorithm/stl/include/ops_stl.hpp @@ -62,7 +62,7 @@ class NalitovDDijkstrasAlgorithmSTL : public BaseTask { std::vector pool_; std::vector shard_results_; - std::atomic pivot_{}; + std::atomic pivot_; std::atomic mode_{WorkMode::kParked}; std::atomic shutdown_{false};