From 577b3a8cdfac04a9dc2ab94addf8ad2d323a810e Mon Sep 17 00:00:00 2001 From: Hyukjin Kwon Date: Tue, 20 Jan 2026 18:13:06 +0900 Subject: [PATCH] Make DictionaryArray::dictionary() thread-safe --- cpp/src/arrow/array/array_dict.cc | 6 ++---- cpp/src/arrow/array/array_dict.h | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cpp/src/arrow/array/array_dict.cc b/cpp/src/arrow/array/array_dict.cc index 2e54e6ec490..6b3511721d2 100644 --- a/cpp/src/arrow/array/array_dict.cc +++ b/cpp/src/arrow/array/array_dict.cc @@ -108,10 +108,8 @@ DictionaryArray::DictionaryArray(const std::shared_ptr& type, } const std::shared_ptr& DictionaryArray::dictionary() const { - if (!dictionary_) { - // TODO(GH-36503) this isn't thread safe - dictionary_ = MakeArray(data_->dictionary); - } + std::call_once(dictionary_init_flag_, + [this]() { dictionary_ = MakeArray(data_->dictionary); }); return dictionary_; } diff --git a/cpp/src/arrow/array/array_dict.h b/cpp/src/arrow/array/array_dict.h index bf376b51f8c..5844585734d 100644 --- a/cpp/src/arrow/array/array_dict.h +++ b/cpp/src/arrow/array/array_dict.h @@ -19,6 +19,7 @@ #include #include +#include #include "arrow/array/array_base.h" #include "arrow/array/data.h" @@ -118,8 +119,10 @@ class ARROW_EXPORT DictionaryArray : public Array { const DictionaryType* dict_type_; std::shared_ptr indices_; - // Lazily initialized when invoking dictionary() + // Lazily initialized when invoking dictionary(). + // Thread-safe initialization is ensured by dictionary_init_flag_. mutable std::shared_ptr dictionary_; + mutable std::once_flag dictionary_init_flag_; }; /// \brief Helper class for incremental dictionary unification