Skip to content

Commit 50dab13

Browse files
[arccore,concurrency] Corrige deadlock potentiel dans 'StdThreadBarrier'.
S'assure qu'un thread reste dans le wait même en cas de reveil intempestif.
1 parent 095b970 commit 50dab13

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

arccore/src/concurrency/arccore/concurrency/StdThreadImplementation.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,17 @@ class StdThreadBarrier
120120
{
121121
std::unique_lock<std::mutex> lk(m_wait_mutex);
122122
++m_current_reached;
123+
Int32 generation = m_generation;
123124
//cout << "ADD BARRIER N=" << m_current_reached << '\n';
124125
if (m_current_reached == m_nb_thread) {
126+
++m_generation;
125127
m_current_reached = 0;
126128
is_last = true;
127129
//cout << "BROADCAST BARRIER N=" << m_current_reached << '\n';
130+
lk.unlock();
128131
m_wait.notify_all();
129132
}
130-
else
133+
while (generation == m_generation)
131134
m_wait.wait(lk);
132135
}
133136
return is_last;
@@ -139,6 +142,7 @@ class StdThreadBarrier
139142
std::condition_variable m_wait;
140143
Integer m_nb_thread = 0;
141144
Integer m_current_reached = 0;
145+
Int32 m_generation = 0;
142146
};
143147

144148
/*---------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)