Skip to content

Commit c3d1083

Browse files
seanmdzenanz
authored andcommitted
BUG: Changed a lazy one-time initialization to use call_once.
It was previously using an incorrect double checked locking pattern.
1 parent 8b9f76b commit c3d1083

File tree

1 file changed

+4
-11
lines changed

1 file changed

+4
-11
lines changed

Modules/Core/Common/src/itkImageSourceCommon.cxx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,16 @@ namespace itk
2525

2626
namespace
2727
{
28-
std::mutex globalDefaultSplitterLock;
28+
std::once_flag globalDefaultSplitterOnceFlag;
2929
ImageRegionSplitterBase::Pointer globalDefaultSplitter;
3030
} // namespace
3131

3232
const ImageRegionSplitterBase *
3333
ImageSourceCommon::GetGlobalDefaultSplitter()
3434
{
35-
if (globalDefaultSplitter.IsNull())
36-
{
37-
// thread safe lazy initialization, prevent race condition on
38-
// setting, with an atomic set if null.
39-
std::lock_guard<std::mutex> lock(globalDefaultSplitterLock);
40-
if (globalDefaultSplitter.IsNull())
41-
{
42-
globalDefaultSplitter = ImageRegionSplitterSlowDimension::New().GetPointer();
43-
}
44-
}
35+
std::call_once(globalDefaultSplitterOnceFlag,
36+
[]() { globalDefaultSplitter = ImageRegionSplitterSlowDimension::New().GetPointer(); });
37+
4538
return globalDefaultSplitter;
4639
}
4740

0 commit comments

Comments
 (0)