From 20901579afc14c67e76aa1859c49f254f3bc625e Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Fri, 17 Apr 2026 21:11:39 +0200 Subject: [PATCH] IndexerThreadPool: Tightening of thread safety --- image_analysis/indexing/IndexerThreadPool.cpp | 9 +++++---- image_analysis/indexing/IndexerThreadPool.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/image_analysis/indexing/IndexerThreadPool.cpp b/image_analysis/indexing/IndexerThreadPool.cpp index c9284048..e900891d 100644 --- a/image_analysis/indexing/IndexerThreadPool.cpp +++ b/image_analysis/indexing/IndexerThreadPool.cpp @@ -105,8 +105,9 @@ void IndexerThread::Worker(const IndexingSettings &settings, int threadid) { { std::unique_lock lock(m); c_start.wait(lock, [this] { return stop || state == TaskState::READY; }); - if (stop) + if (stop && (state != TaskState::READY)) return; + state = TaskState::RUNNING; input = std::move(task_input); } if (input) { @@ -138,8 +139,8 @@ void IndexerThread::Worker(const IndexingSettings &settings, int threadid) { std::unique_lock lock(m); state = TaskState::COMPLETED; result = std::move(tmp_result); - c_done.notify_all(); } + c_done.notify_all(); } } } @@ -149,7 +150,7 @@ void IndexerThread::Finalize() { std::unique_lock lock(m); stop = true; } - c_start.notify_one(); + c_start.notify_all(); if (worker_thread.joinable()) worker_thread.join(); } @@ -173,7 +174,7 @@ std::unique_ptr IndexerThread::Run(const DiffractionExperiment &e tmp_result = std::move(result); state = TaskState::IDLE; } - return std::move(tmp_result); + return tmp_result; } IndexerThread::~IndexerThread() { diff --git a/image_analysis/indexing/IndexerThreadPool.h b/image_analysis/indexing/IndexerThreadPool.h index daa757f8..bcd6fdc5 100644 --- a/image_analysis/indexing/IndexerThreadPool.h +++ b/image_analysis/indexing/IndexerThreadPool.h @@ -28,7 +28,7 @@ class IndexerThread { }; bool stop = false; - enum class TaskState {STARTING, IDLE, READY, COMPLETED, ERROR} state = TaskState::STARTING; + enum class TaskState {STARTING, IDLE, READY, RUNNING, COMPLETED, ERROR} state = TaskState::STARTING; std::mutex m; std::condition_variable c_running; std::condition_variable c_start;