zoukankan      html  css  js  c++  java
  • 线程本地存储(Thread Local Storage, TLS)简单分析与使用


      在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS, 线程本地存储. 它的使用非常之简单, 只要对变量的声明使用__declspec(thread)就OK了. 下面我来举一个例子, 结合注释, 相信大家马上就能知道其”奥秘”了.
      #include "stdafx.h"
      #include <stdio.h>
      __declspec(thread) int g_nData = 0; //这就是两个线程都要访问的变量
      DWORD WINAPI ThreadProc(LPVOID lpParameter)
      {
      g_nData = 5;
      //辅线程睡眠100ms, 保证主线程的g_nData = 10; 语句执行成功
       Sleep(100); 
       char szMsg[40] = {0};
       sprintf(szMsg, "Auxi thread, g_nData: %d", g_nData);
       MessageBox(NULL, szMsg, "AuxiThread", MB_ICONINFORMATION);
       return 0;
      }
      int APIENTRY WinMain(HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPSTR lpCmdLine,
       int nCmdShow)
      {
       // TODO: Place code here.
      DWORD dwId;
      //创建线程, 并立即启动它
       HANDLE hThread = CreateThread(NULL, 1024, ThreadProc, NULL, 0, &dwId);
      assert(hThread);
      //主线程睡50ms, 保证辅线程的g_nData = 5; 语句执行成功
       Sleep(50);
       g_nData = 10;
       char szMsg[40] = {0};
       sprintf(szMsg, "Result: %d", g_nData);
       MessageBox(NULL, szMsg, "MainThread", MB_ICONINFORMATION);
       return 0;
      }
      大家自己编译运行这个程序就会发现, 如果不使用TLS, 那么结果都是10; 如果使用TLS, 那么主, 助线程的结果将各不影响. 这下你该知道TLS是怎么回事了吧. J
      当然, 更复杂的TLS, 就会需要用到Windows TLS的API: TlsAlloc, TlsFree, TlsSetValue, TlsGetValue了; 进一步还需要同步互斥等等.

  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4863969.html
Copyright © 2011-2022 走看看