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 1a5234b4a578..5daa1a9229fc 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 18bb7543cad9..476048418748 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 { }