13#ifndef dealii_thread_local_storage_h
14# define dealii_thread_local_storage_h
26# include <shared_mutex>
55 struct unpack_container
60 template <
typename T,
typename A>
61 struct unpack_container<
std::vector<T, A>>
66 template <
typename T,
typename A>
67 struct unpack_container<
std::list<T, A>>
101 template <
typename T>
105 std::is_copy_constructible_v<
106 typename internal::unpack_container<T>::type> ||
107 std::is_default_constructible_v<T>,
108 "The stored type must be either copyable, or default constructible");
259 std::map<std::thread::id, T>
data;
287 template <
typename T>
289 : exemplar(t.exemplar)
293 std::shared_lock<
decltype(insertion_mutex)> lock(t.insertion_mutex);
299 template <
typename T>
301 : exemplar(std::move(t.exemplar))
321 std::unique_lock<
decltype(insertion_mutex)> lock(t.insertion_mutex);
322 data = std::move(t.data);
327 template <
typename T>
334 template <
typename T>
336 : exemplar(
std::make_shared<
T>(
std::forward<
T>(t)))
341 template <
typename T>
342 inline ThreadLocalStorage<T> &
347 std::shared_lock<
decltype(insertion_mutex)> reader_lock(t.insertion_mutex);
348 std::unique_lock<
decltype(insertion_mutex)> writer_lock(insertion_mutex);
351 exemplar = t.exemplar;
358 template <
typename T>
359 inline ThreadLocalStorage<T> &
368 std::unique_lock<
decltype(insertion_mutex)> reader_lock(t.insertion_mutex);
369 std::unique_lock<
decltype(insertion_mutex)> writer_lock(insertion_mutex);
371 data = std::move(t.data);
372 exemplar = std::move(t.exemplar);
387 template <
typename T>
389 std::is_copy_constructible_v<typename unpack_container<T>::type>,
391 construct_element(std::map<std::thread::id, T> &
data,
392 const std::thread::id &
id,
393 const std::shared_ptr<const T> &exemplar)
397 const auto it =
data.emplace(
id, *exemplar).first;
403 template <
typename T>
405 !std::is_copy_constructible_v<typename unpack_container<T>::type>,
407 construct_element(std::map<std::thread::id, T> &
data,
408 const std::thread::id &
id,
409 const std::shared_ptr<const T> &)
417 template <
typename T>
421 const std::thread::id my_id = std::this_thread::get_id();
433 std::shared_lock<
decltype(insertion_mutex)> lock(insertion_mutex);
435 const auto it =
data.find(my_id);
436 if (it !=
data.end())
450 std::unique_lock<
decltype(insertion_mutex)> lock(insertion_mutex);
452 return internal::construct_element(
data, my_id, exemplar);
457 template <
typename T>
462 std::shared_lock<
decltype(insertion_mutex)> lock(insertion_mutex);
466 const auto it =
data.find(
id);
467 if (it !=
data.end())
474 template <
typename T>
483 template <
typename T>
484 inline ThreadLocalStorage<T>::operator
T &()
490 template <
typename T>
491 inline ThreadLocalStorage<T> &
499 template <
typename T>
500 inline ThreadLocalStorage<T> &
503 get() = std::forward<T>(t);
508 template <
typename T>
512 std::unique_lock<
decltype(insertion_mutex)> lock(insertion_mutex);
A class that provides a separate storage location on each thread that accesses the object.
std::optional< T > get_for_thread(const std::thread::id &id) const
ThreadLocalStorage & operator=(const ThreadLocalStorage &t)
ThreadLocalStorage(const ThreadLocalStorage &)
ThreadLocalStorage(const T &t)
ThreadLocalStorage()=default
std::map< std::thread::id, T > data
ThreadLocalStorage< T > & operator=(const T &t)
std::shared_ptr< const T > exemplar
ThreadLocalStorage(T &&t)
ThreadLocalStorage & operator=(ThreadLocalStorage &&t) noexcept
ThreadLocalStorage< T > & operator=(T &&t)
ThreadLocalStorage(ThreadLocalStorage &&t) noexcept
std::shared_mutex insertion_mutex
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
std::vector< index_type > data
* * * * std::vector< Number > ThermoPlasticMaterial< dim, ViscoplasticYieldLaw, Number >::get_state_parameters const