Foundationপ্রথম নীতি থেকে
LEVEL 4 · Operating Systems

Thread-Local Storage

থ্রেড-লোকাল স্টোরেজ

প্রতিটা thread-এর নিজস্ব কপি পায় এমন variable। x86-64-এ `fs` segment register দিয়ে অ্যাক্সেস করা হয়, তাই খরচ প্রায় সাধারণ global-এর সমান।

also: TLS, __thread

__thread int counter;              /* GCC/Clang */
_Thread_local int counter;         /* C11 */
thread_local int counter;          /* C++11 */

প্রতিটা thread নিজের counter পায় — কোনো lock লাগে না।

কীভাবে কাজ করে: x86-64-এ fs segment register প্রতিটা thread-এর TLS block-এর দিকে তাক করে থাকে। একটা TLS variable access করা মানে mov %fs:offset, %eax — একটা instruction, প্রায় সাধারণ global-এর সমান খরচ।

Context switch-এ kernel fs base (FSBASE MSR) বদলে দেয়, তাই একই কোড আলাদা thread-এ আলাদা memory ছোঁয়।

সবচেয়ে বিখ্যাত TLS variable — errno এটা আসলে একটা macro:

#define errno (*__errno_location())

Thread-local না হলে দুইটা thread একসাথে syscall করলে একে অপরের error code মুছে দিত — একটা কুখ্যাত পুরনো bug।

সতর্কতা: TLS variable-এর constructor/destructor আছে (C++-এ), আর dlopen করা library-তে TLS ব্যবহারে খরচ বেড়ে যায় (dynamic TLS model)। Latency-সংবেদনশীল কোডে খেয়াল রাখুন।