Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SpinLock.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* SpinLock.cc (C) 2000-2024 */
9/* */
10/* SpinLock pour le multi-threading. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/concurrency/SpinLock.h"
15
16#include "arccore/concurrency/NullThreadImplementation.h"
17#include "arccore/concurrency/SpinLock.h"
19
20#include <iostream>
21
22// La fonction atomic_flag::wait() n'est disponible que pour le C++20
23#if __cpp_lib_atomic_wait >= 201907L
24#define ARCCORE_HAS_ATOMIC_WAIT
25#endif
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arccore
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
38{
39 bool is_need_sync = Concurrency::getThreadImplementation()->isMultiThread();
40 m_mode = (is_need_sync) ? eMode::SpinAndMutex : eMode::None;
41 _doUnlock();
42}
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
48SpinLock(eMode mode)
49: m_mode(mode)
50{
51 _doUnlock();
52}
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57SpinLock::
58~SpinLock()
59{
60}
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
65void SpinLock::
66_doLockReal()
67{
68 while (m_spin_lock.test_and_set(std::memory_order_acquire)) {
69 // L'appel au wait() permet d'eviter la contention
70 // si beaucoup de threads essaient d'accéder en même temps
71 // au verrou.
72 if (m_mode == eMode::SpinAndMutex) {
73#ifdef ARCCORE_HAS_ATOMIC_WAIT
74 m_spin_lock.wait(true, std::memory_order_relaxed);
75#endif
76 }
77 }
78}
79
80void SpinLock::
81_doUnlockReal()
82{
83 m_spin_lock.clear(std::memory_order_release);
84#ifdef ARCCORE_HAS_ATOMIC_WAIT
85 if (m_mode == eMode::SpinAndMutex) {
86 // A noter que notify_one() augmente de 50% le temps passé dans cette
87 // fonction. Il n'est utile que si on utilise wait()/
88 // Comme wait() n'est intéressant que s'il y a contention, on pourrait
89 // rendre cet appel configurable.
90 m_spin_lock.notify_one();
91 }
92#endif
93}
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(IThreadImplementation);
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103} // End namespace Arccore
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour définir les méthodes et types une classe qui utilise un compteur de référence.
SpinLock()
SpinLock par défaut.
Definition SpinLock.cc:37
eMode
Mode du spinlock. Le défaut est 'Auto'.
@ SpinAndMutex
SpinLock puis mutex.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24