diff options
author | A. Unique TensorFlower <gardener@tensorflow.org> | 2017-11-21 23:05:17 -0800 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2017-11-21 23:08:52 -0800 |
commit | f93c48dc061d23495a4425fcad17d55159cb02b1 (patch) | |
tree | ee1210f8810e0b0fec9346f762e854b371899919 /tensorflow/contrib/nccl | |
parent | ef3ee202659a2a49afcd9898451bf9b1256a2757 (diff) |
Use LINKER_INITIALIZED for mutexes with static storage class.
This was causing exit-time races as some threads were accessing the
mutex as it was being destructed.
---------------
It is illegal to use any static type with a constructor/destructor with static
storage class in a multithreaded C++ programme that can exit(), even if the
constructor is protected by C++11's function-scope static initialization rules,
because exit-time destruction is unsafe in the presence of multiple threads.
For things that are not function-scope, the construction is also unsafe,
because global contruction ordering is undefined in general.
The LINKER_INITIALIZED variant constructor for TensorFlow's mutex avoids these
problems, at the cost of relying on the linker to zero-initialize the BSS
region.
PiperOrigin-RevId: 176612772
Diffstat (limited to 'tensorflow/contrib/nccl')
-rw-r--r-- | tensorflow/contrib/nccl/kernels/nccl_manager.cc | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/tensorflow/contrib/nccl/kernels/nccl_manager.cc b/tensorflow/contrib/nccl/kernels/nccl_manager.cc index 1eb1481675..31a35b0d53 100644 --- a/tensorflow/contrib/nccl/kernels/nccl_manager.cc +++ b/tensorflow/contrib/nccl/kernels/nccl_manager.cc @@ -370,7 +370,7 @@ void NcclManager::AddParticipant(int num_devices, const string& key, } void NcclManager::RunCollective(const string& key, Collective* collective) { - static mutex collective_mu; + static mutex collective_mu(LINKER_INITIALIZED); auto* communicator = GetCommunicator(collective); collective->communicator = communicator; |