From 9b34f8dabde93be93c4b99b756d3eae5d4d14398 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Wed, 6 Jun 2018 15:51:55 +0800 Subject: [PATCH] fix abort issue in cpu multi-threads --- paddle/fluid/framework/scope.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/paddle/fluid/framework/scope.cc b/paddle/fluid/framework/scope.cc index 9091713158..d1850b055c 100644 --- a/paddle/fluid/framework/scope.cc +++ b/paddle/fluid/framework/scope.cc @@ -51,6 +51,8 @@ Scope& Scope::NewScope() const { Variable* Scope::Var(const std::string& name) { auto* v = FindVarLocally(name); if (v != nullptr) return v; + // acquire the lock when new var under this scope + std::unique_lock lock(mutex_); v = new Variable(); vars_[name] = v; VLOG(3) << "Create variable " << name; @@ -83,6 +85,7 @@ const Scope* Scope::FindScope(const Variable* var) const { return (parent_ == nullptr) ? nullptr : parent_->FindScope(var); } void Scope::DropKids() { + std::unique_lock lock(mutex_); for (Scope* s : kids_) delete s; kids_.clear(); } @@ -110,6 +113,7 @@ void Scope::DeleteScope(Scope* scope) const { } void Scope::EraseVars(const std::vector& var_names) { + std::unique_lock lock(mutex_); std::set var_set(var_names.begin(), var_names.end()); for (auto it = vars_.begin(); it != vars_.end();) { if (var_set.find(it->first) != var_set.end()) { @@ -140,6 +144,8 @@ std::string Scope::Rename(const std::string& origin_name) const { } Variable* Scope::FindVarLocally(const std::string& name) const { + // acquire the lock when find locally + std::unique_lock lock(mutex_); auto it = vars_.find(name); if (it != vars_.end()) return it->second; return nullptr; -- GitLab