Skip to content

Commit 1cd0942

Browse files
Merge pull request #2134 from arcaneframework/dev/gg-fix-potential-deadlock-in-thread-barrier
Fix potential deadlock in `StdThreadBarrier`
2 parents 095b970 + 50dab13 commit 1cd0942

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)