#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