Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ThreadPrivate.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ThreadPrivate.h (C) 2000-2018 */
9/* */
10/* Classe permettant de conserver une valeur spécifique par thread. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_CONCURRENCY_THREADPRIVATE_H
13#define ARCCORE_CONCURRENCY_THREADPRIVATE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/ArccoreGlobal.h"
18
19#include "arccore/concurrency/GlibAdapter.h"
20
21#include <vector>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arccore
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Conteneur pour les valeurs privées par thread.
33 *
34 * Il faut appeler initialize() avant d'utiliser les méthodes setValue()/getValue().
35 * Cette méthode initialize() peut être appelée plusieurs fois.
36 *
37 * \deprecated Utiliser 'thread_local' du C++11.
38 */
39class ARCCORE_CONCURRENCY_EXPORT ThreadPrivateStorage
40{
41 public:
42
43 ARCCORE_DEPRECATED_REASON("Y2022; This class is deprecated. Use 'thread_local' specifier.")
46
47 public:
48
49 /*!
50 * \brief Initialise la clé contenant les valeurs par thread.
51 * Cette méthode peut être appelée plusieurs fois et ne fait rien si
52 * la clé a déjà été initialisée.
53 *
54 * \warning Cette méthode n'est pas thread-safe. L'utilisateur doit donc
55 * faire attention lors du premier appel.
56 */
57 void initialize();
58 void* getValue();
59 void setValue(void* v);
60 private:
61 GlibPrivate* m_storage;
62};
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66/*!
67 * \brief Classe de base permettant de conserveur une instance d'un objet par thread.
68 *
69 * \deprecated Utiliser 'thread_local' du C++11.
70 */
71class ARCCORE_CONCURRENCY_EXPORT ThreadPrivateBase
72{
73 public:
75 {
76 public:
77 virtual ~ICreateFunctor(){}
78 virtual void* createInstance() =0;
79 };
80
81 public:
82
83 ARCCORE_DEPRECATED_REASON("Y2022; This class is deprecated. Use 'thread_local' specifier.")
85 : m_key(key), m_create_functor(create_functor)
86 {
87 }
88
90 {
91 }
92
93 public:
94
95 /*!
96 * \brief Récupère l'instance spécifique au thread courant.
97 *
98 * Si cette dernière n'existe pas encore, elle est créé via
99 * le functor passé en argument du constructeur.
100 *
101 * \warning Cette méthode ne doit pas être appelée tant que
102 * la clé associée (ThreadPrivateStorage) n'a pas été initialisée
103 * par l'apple à ThreadPrivateStorage::initialize().
104 */
105 void* item();
106
107 private:
108
109 ThreadPrivateStorage* m_key;
110 GlibMutex m_mutex;
111 ICreateFunctor* m_create_functor;
112};
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116/*!
117 * \brief Classe permettant une instance d'un type par thread.
118 *
119 * Il faut passer en argument du constructeur le conteneur permettant
120 * de conserver les valeurs. Ce conteneur doit avoir été initialisé
121 * via ThreadPrivateStorage::initialize() avant d'utiliser cette classe.
122 *
123 * Cette classe ne possède qu'une seule méthode item()
124 * permettant de récupérer une instance d'un type \a T par
125 * thread. Au premier appel de item() pour un thread donné,
126 * une instance de \a T est construite.
127 * Le type \a T doit avoir un constructeur par défaut
128 * et doit avoir une méthode \a build().
129 * \threadsafeclass
130 *
131 * \deprecated Utiliser 'thread_local' du C++11.
132 */
133template<typename T>
136{
137 public:
138
139 ARCCORE_DEPRECATED_REASON("Y2022; This class is deprecated. Use 'thread_local' specifier.")
141 : m_storage(key,this)
142 {
143 }
144
146 {
147 for( T* item : m_allocated_items )
148 delete item;
149 }
150
151 public:
152 //! Instance spécifique au thread courant.
153 T* item()
154 {
155 return (T*)(m_storage.item());
156 }
157
158 private:
159
160 void* createInstance() override
161 {
162 T* new_ptr = new T();
163 new_ptr->build();
164 m_allocated_items.push_back(new_ptr);
165 return new_ptr;
166 }
167
168 private:
169 std::vector<T*> m_allocated_items;
170 ThreadPrivateBase m_storage;
171};
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
176} // End namespace Arccore
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181#endif
Classe de base permettant de conserveur une instance d'un objet par thread.
void * item()
Récupère l'instance spécifique au thread courant.
Conteneur pour les valeurs privées par thread.
Classe permettant une instance d'un type par thread.
T * item()
Instance spécifique au thread courant.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24