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