#include <iostream>
#include <thread>
/*
* 线程本地存储(Thread Local Storage, TLS)是一种在线程内部共享数据的数据交换区域。
*
* 每个线程都可以在这个区域保存它们要在内部共享的数据。
*
* 一个比较知名的例子是C语言的全局变量errno。对于errno这类的全局变量来说,如果多线程进程的某一个线程对其进行了
* 修改,那么这个变量就会影响到其他所有的线程。这显然和实际需求相悖,因此全局变量errno必须保存在TLS中。
*
* 为解决这个矛盾,C++11标准新增了一个限定符thread_local。它能将指定变量和特定的线程联系起来。由它限定的变量被
* 初始化,并且会被保存在TLS中。
*/
thread_local int tmp = 3;
int main()
{
std::cout << tmp << std::endl;
}
#if 0
/*
* intel
*/
00000000000011a9 <main>:
11a9: f3 0f 1e fa endbr64
11ad: 55 push %rbp
11ae: 48 89 e5 mov %rsp,%rbp
11b1: 64 8b 04 25 fc ff ff mov %fs:0xfffffffffffffffc,%eax
11b8: ff
11b9: 89 c6 mov %eax,%esi
11bb: 48 8d 3d 7e 2e 00 00 lea 0x2e7e(%rip),%rdi # 4040 <_ZSt4cout@@GLIBCXX_3.4>
11c2: e8 e9 fe ff ff callq 10b0 <_ZNSolsEi@plt>
11c7: 48 89 c2 mov %rax,%rdx
11ca: 48 8b 05 ff 2d 00 00 mov 0x2dff(%rip),%rax # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
11d1: 48 89 c6 mov %rax,%rsi
11d4: 48 89 d7 mov %rdx,%rdi
11d7: e8 b4 fe ff ff callq 1090 <_ZNSolsEPFRSoS_E@plt>
11dc: b8 00 00 00 00 mov $0x0,%eax
11e1: 5d pop %rbp
11e2: c3 retq
/*
* arm
*/
00000000004008bc <main>:
4008bc: a9bf7bfd stp x29, x30, [sp, #-16]!
4008c0: 910003fd mov x29, sp
4008c4: d53bd040 mrs x0, tpidr_el0
4008c8: 91400000 add x0, x0, #0x0, lsl #12
4008cc: 91004000 add x0, x0, #0x10
4008d0: b9400001 ldr w1, [x0]
4008d4: b0000080 adrp x0, 411000 <_ZNSolsEi@GLIBCXX_3.4>
4008d8: 91016000 add x0, x0, #0x58
4008dc: 97ffff95 bl 400730 <_ZNSolsEi@plt>
4008e0: aa0003e2 mov x2, x0
4008e4: 90000000 adrp x0, 400000 <tmp+0x400000>
4008e8: 911ec000 add x0, x0, #0x7b0
4008ec: aa0003e1 mov x1, x0
4008f0: aa0203e0 mov x0, x2
4008f4: 97ffffab bl 4007a0 <_ZNSolsEPFRSoS_E@plt>
4008f8: 52800000 mov w0, #0x0 // #0
4008fc: a8c17bfd ldp x29, x30, [sp], #16
400900: d65f03c0 ret
#endif