diff --git a/cpp/src/arrow/array/array_dict.cc b/cpp/src/arrow/array/array_dict.cc index 2e54e6ec4904..25bf381bbb6a 100644 --- a/cpp/src/arrow/array/array_dict.cc +++ b/cpp/src/arrow/array/array_dict.cc @@ -108,10 +108,9 @@ 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(dict_init_flag_, [this]() { + const_cast(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 bf376b51f8c9..8d8e1bfe69a3 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" @@ -120,6 +121,7 @@ class ARROW_EXPORT DictionaryArray : public Array { // Lazily initialized when invoking dictionary() mutable std::shared_ptr dictionary_; + mutable std::once_flag dict_init_flag_; }; /// \brief Helper class for incremental dictionary unification