14 #if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO
15 # include <tbb/enumerable_thread_specific.h>
17 # include <unordered_map>
22 # include <functional>
27 #if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO
41 using Map = std::unordered_map<std::thread::id, T>;
42 using Create = std::function<T()>;
44 mutable std::mutex _mutex;
48 explicit ThreadLocal(
const T& init) : _create{[init]{
return init;}} {}
50 _map{std::move(other._map)},
51 _create{std::move(other._create)} {
54 _map = std::move(other._map);
55 _create = std::move(other._create);
60 explicit ThreadLocal(
const Create& create_) : _create{create_}
64 auto threadId = std::this_thread::get_id();
65 std::lock_guard<std::mutex> lock{_mutex};
66 auto itThreadLocal = _map.find(threadId);
67 if (itThreadLocal != _map.end()) {
68 return itThreadLocal->second;
70 return _map.emplace(threadId, _create()).first->second;
74 auto size()
const -> decltype(_map.size()) {
75 std::lock_guard<std::mutex> lock{_mutex};
80 template <
typename It>
83 bool operator!=(
const Iterator& other) {
return it != other.it;}
84 Iterator& operator++() {++it;
return *
this;}
85 auto operator*() -> decltype(it->second) {
return it->second;}
86 auto operator->() -> decltype(&(it->second)) {
return &(it->second);}
87 auto operator*()
const -> decltype(it->second) {
return it->second;}
88 auto operator->()
const -> decltype(&(it->second)) {
return &(it->second);}
91 auto begin() -> Iterator<decltype(_map.begin())> {
return {_map.begin()};}
92 auto end() -> Iterator<decltype(_map.end())> {
return {_map.end()};}
93 auto begin()
const -> Iterator<decltype(_map.begin())>
const {
return {_map.begin()};}
94 auto end()
const -> Iterator<decltype(_map.end())>
const {
return {_map.end()};}
tbb::enumerable_thread_specific< T > ThreadLocal
A wrapper class to keep object to be thread local.
Definition: ie_thread_local.hpp:35
Inference Engine Plugin API namespace.