From 466f5200af5a2802653425cdbf3f4187465050ac Mon Sep 17 00:00:00 2001 From: rajanyadav0307 Date: Thu, 18 Dec 2025 10:38:48 -0600 Subject: [PATCH] ThreadTask: fix thread lifetime ordering and make detach flag atomic Change: Reorder ThreadTask data members so std::thread is destroyed last, ensuring all members accessed by the running thread remain valid during shutdown. Also make the detach flag atomic to avoid potential data races between the executor thread and the owning thread. Reason: This change improves thread-safety and prevents subtle undefined behavior without modifying the public API. --- .../include/aws/core/utils/threading/ThreadTask.h | 4 ++-- src/aws-cpp-sdk-core/source/utils/threading/ThreadTask.cpp | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/aws-cpp-sdk-core/include/aws/core/utils/threading/ThreadTask.h b/src/aws-cpp-sdk-core/include/aws/core/utils/threading/ThreadTask.h index 1a5234b4a57..5daa1a9229f 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/utils/threading/ThreadTask.h +++ b/src/aws-cpp-sdk-core/include/aws/core/utils/threading/ThreadTask.h @@ -41,10 +41,10 @@ namespace Aws void MainTaskRunner(); private: - std::atomic m_continue; PooledThreadExecutor& m_executor; + std::atomic m_continue; + std::atomic m_detached; std::thread m_thread; - bool m_detached = false; }; } } diff --git a/src/aws-cpp-sdk-core/source/utils/threading/ThreadTask.cpp b/src/aws-cpp-sdk-core/source/utils/threading/ThreadTask.cpp index 18bb7543cad..47604841874 100644 --- a/src/aws-cpp-sdk-core/source/utils/threading/ThreadTask.cpp +++ b/src/aws-cpp-sdk-core/source/utils/threading/ThreadTask.cpp @@ -9,7 +9,11 @@ using namespace Aws::Utils; using namespace Aws::Utils::Threading; -ThreadTask::ThreadTask(PooledThreadExecutor& executor) : m_continue(true), m_executor(executor), m_thread(std::bind(&ThreadTask::MainTaskRunner, this)) +ThreadTask::ThreadTask(PooledThreadExecutor& executor) + : m_executor(executor), + m_continue(true), + m_detached(false), + m_thread([this]() { this->MainTaskRunner(); }) // lambda captures this { }