Return -1 from CurrentThreadId when called by thread outside the pool.
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
index 0af91fe..3427073 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
@@ -172,6 +172,8 @@
     pool_->Schedule(func);
   }
 
+  // Returns a logical thread index between 0 and pool_->NumThreads() - 1 if
+  // called from one of the threads in pool_. Returns -1 otherwise.
   EIGEN_STRONG_INLINE int currentThreadId() const {
     return pool_->CurrentThreadId();
   }
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h b/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
index 1369ca1..33ae451 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
@@ -99,13 +99,13 @@
     return static_cast<int>(threads_.size());
   }
 
-  int CurrentThreadId() const {
+  int CurrentThreadId() const final {
     const PerThread* pt =
         const_cast<NonBlockingThreadPoolTempl*>(this)->GetPerThread();
     if (pt->pool == this) {
       return pt->thread_id;
     } else {
-      return NumThreads();
+      return -1;
     }
   }
 
@@ -113,10 +113,10 @@
   typedef typename Environment::EnvThread Thread;
 
   struct PerThread {
-    constexpr PerThread() : pool(NULL), index(-1), rand(0) { }
+    constexpr PerThread() : pool(NULL), rand(0), thread_id(-1) { }
     NonBlockingThreadPoolTempl* pool;  // Parent pool, or null for normal threads.
-    int thread_id;         // Worker thread index in pool.
-    uint64_t rand;          // Random generator state.
+    uint64_t rand;  // Random generator state.
+    int thread_id;  // Worker thread index in pool.
   };
 
   Environment env_;
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h b/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
index 36eb695..e75d0f4 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
@@ -78,7 +78,7 @@
     if (pt->pool == this) {
       return pt->thread_id;
     } else {
-      return NumThreads();
+      return -1;
     }
   }
 
@@ -128,8 +128,9 @@
   };
 
   struct PerThread {
-    ThreadPoolTempl* pool;  // Parent pool, or null for normal threads.
-    int thread_id;          // Worker thread index in pool.
+    constexpr PerThread() : pool(NULL), thread_id(-1) { }
+    SimpleThreadPoolTempl* pool;  // Parent pool, or null for normal threads.
+    int thread_id;                // Worker thread index in pool.
   };
 
   Environment env_;
@@ -141,7 +142,7 @@
   bool exiting_ = false;
 
   PerThread* GetPerThread() const {
-    static EIGEN_THREAD_LOCAL PerThread per_thread;
+    EIGEN_THREAD_LOCAL PerThread per_thread;
     return &per_thread;
   }
 };
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h
index 569cd4b..a65ee97 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h
@@ -22,7 +22,7 @@
   virtual int NumThreads() const = 0;
 
   // Returns a logical thread index between 0 and NumThreads() - 1 if called
-  // from one of the threads in the pool. Returns NumThreads() otherwise.
+  // from one of the threads in the pool. Returns -1 otherwise.
   virtual int CurrentThreadId() const = 0;
 
   virtual ~ThreadPoolInterface() {}
diff --git a/unsupported/test/cxx11_non_blocking_thread_pool.cpp b/unsupported/test/cxx11_non_blocking_thread_pool.cpp
index 6e4e5cb..5f9bb93 100644
--- a/unsupported/test/cxx11_non_blocking_thread_pool.cpp
+++ b/unsupported/test/cxx11_non_blocking_thread_pool.cpp
@@ -28,7 +28,7 @@
   const int kThreads = 16;  // code below expects that this is a multiple of 4
   NonBlockingThreadPool tp(kThreads);
   VERIFY_IS_EQUAL(tp.NumThreads(), kThreads);
-  VERIFY_IS_EQUAL(tp.CurrentThreadId(), kThreads);
+  VERIFY_IS_EQUAL(tp.CurrentThreadId(), -1);
   for (int iter = 0; iter < 100; ++iter) {
     std::atomic<int> running(0);
     std::atomic<int> done(0);