Lưu trữ cục bộ luồng là tĩnh nhưng nó hoạt động khá khác với lưu trữ tĩnh đơn giản.
Khi bạn khai báo một biến static, sẽ có đúng một phiên bản của biến. Hệ thống biên dịch / thời gian chạy đảm bảo rằng nó sẽ được khởi tạo cho bạn vào một lúc nào đó trước khi bạn thực sự sử dụng nó, mà không chỉ định chính xác khi nào (một số chi tiết được bỏ qua ở đây.)
C ++ 11 đảm bảo rằng quá trình khởi tạo này sẽ an toàn cho luồng, tuy nhiên trước C ++ 11, an toàn cho luồng này không được đảm bảo. Ví dụ
static X * pointer = new X;
có thể làm rò rỉ các phiên bản của X nếu nhiều luồng truy cập mã khởi tạo tĩnh cùng một lúc.
Khi bạn khai báo một biến địa phương luồng có thể có nhiều trường hợp của biến. Bạn có thể nghĩ chúng nằm trong một bản đồ được lập chỉ mục bởi thread-id. Điều đó có nghĩa là mỗi luồng nhìn thấy bản sao biến của chính nó.
Một lần nữa, nếu biến được khởi tạo, hệ thống biên dịch / thời gian chạy đảm bảo rằng quá trình khởi tạo này sẽ diễn ra trước khi dữ liệu được sử dụng và quá trình khởi tạo sẽ diễn ra cho mỗi luồng sử dụng biến. Trình biên dịch cũng đảm bảo rằng quá trình khởi tạo sẽ an toàn cho luồng.
Đảm bảo an toàn cho luồng có nghĩa là có thể có khá nhiều mã hậu trường để làm cho biến hoạt động theo cách bạn mong đợi - đặc biệt là khi xem xét rằng trình biên dịch không có cách nào biết trước chính xác bao nhiêu luồng sẽ tồn tại trong chương trình của bạn và bao nhiêu trong số này sẽ chạm vào biến cục bộ của luồng.
thread_local
biến cục bộ không có ý nghĩa gì khi bắt đầu… mỗi luồng có ngăn xếp cuộc gọi riêng của nó.