Локальне сховище потоків є статичним, але воно поводиться зовсім інакше, ніж просто статичне сховище.
Коли ви оголошуєте змінну статичною, існує рівно один екземпляр змінної. Система компілятора / середовища виконання гарантує, що вона буде ініціалізована для вас колись до того, як ви її фактично використаєте, не вказуючи, коли саме (деякі деталі тут пропущено.)
C ++ 11 гарантує, що ця ініціалізація буде безпечною для потоків, однак до C ++ 11 ця безпека потоків не була гарантована. Наприклад
static X * pointer = new X;
може витікати примірники X, якщо більше ніж один потік потрапляє в статичний код ініціалізації одночасно.
Коли ви оголошуєте потік змінної локальним, потенційно може бути багато примірників змінної. Ви можете думати про них, як про те, що вони перебувають на карті, яка індексується за допомогою ідентифікатора потоку. Це означає, що кожен потік бачить свою копію змінної.
Знову ж таки, якщо змінна ініціалізована, система компілятора / середовища виконання гарантує, що ця ініціалізація відбудеться до використання даних і що ініціалізація відбудеться для кожного потоку, який використовує змінну. Компілятор також гарантує, що ініціація буде безпечною для потоків.
Гарантії безпеки потоків означають, що може бути досить багато закулісного коду, щоб змінна поводилась так, як ви очікуєте - особливо зважаючи на те, що компілятор не може заздалегідь точно знати, скільки потоків буде існують у вашій програмі, і скільки з них торкнеться локальної змінної потоку.
thread_local
локальної змінної не має сенсу починати з ... кожен потік має власний стек викликів.