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-সংবেদনশীল কোডে খেয়াল রাখুন।