///
// 02UseTLS.cpp.cpp文件

/*

动态调TLS的典型步聚:
1,主线程调用TlsAlloc函数为线程局部存储分配索引
DWORD TlsAlloc(void) 返回一个TLS索引 -1为失败

2,每个线程调用TlsSetValue和TlsGetValue设置或读取线程数组中的值:
BOOL TlsSetValue(
DWORD dwTlsIndex, TLS索引
LPVOID lpTlsValue 要设置的值
);
LPVOID TlsGetValue(DWORD dwTlsIndex); TLS索引

3:主线程调用TlsFree释放存储索引,

*/

#include <stdio.h>
#include <windows.h>
#include <process.h>

// 利用TLS记录线程的运行时间

DWORD g_tlsUsedTime;
void InitStartTime();
DWORD GetUsedTime();

UINT __stdcall ThreadFunc(LPVOID)
{
int i;

// 初始化开始时间
InitStartTime();

// 模拟长时间工作
i = 10000*10000;
while(i--) { }

// 打印出本线程运行的时间
printf(" This thread is coming to end. Thread ID: %-5d, Used Time: %d \n", 
::GetCurrentThreadId(), GetUsedTime());
return 0;
}

int main(int argc, char* argv[])
{
UINT uId;
int i;
HANDLE h[10];

// 通过在进程位数组中申请一个索引,初始化线程运行时间记录系统
g_tlsUsedTime = ::TlsAlloc();

// 令十个线程同时运行,并等待它们各自的输出结果
for(i=0; i<10; i++)
{
h[i] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId);
}
for(i=0; i<10; i++)
{
::WaitForSingleObject(h[i], INFINITE);
::CloseHandle(h[i]);
}

// 通过释放线程局部存储索引,释放时间记录系统占用的资源
::TlsFree(g_tlsUsedTime);
return 0;
}

// 初始化线程的开始时间
void InitStartTime()
{
// 获得当前时间,将线程的创建时间与线程对象相关联
DWORD dwStart = ::GetTickCount();
::TlsSetValue(g_tlsUsedTime, (LPVOID)dwStart);
}

// 取得一个线程已经运行的时间
DWORD GetUsedTime()
{
// 获得当前时间,返回当前时间和线程创建时间的差值
DWORD dwElapsed = ::GetTickCount();
dwElapsed = dwElapsed - (DWORD)::TlsGetValue(g_tlsUsedTime);
return dwElapsed;
}

第三章 线程局部存储 windows程序设计 王艳平版相关推荐

  1. 第七章 目录监视 windows程序设计王艳平版

    // DirDialog.h文件 #ifndef __DIRDIALOG_H_ #define __DIRDIALOG_H_ #include <shlobj.h> class CDirD ...

  2. 第七章 控件 windows程序设计王艳平版

    / // PredefineClass.h文件 #define IDC_BUTTON 10 // Button按钮 #define IDC_RADIO 11 // 单选框 #define IDC_CH ...

  3. 第九章 DLL文件 windows程序设计 王艳平版

    // 09DllDemo.h文件 #ifdef MY09DLLDEMO_EXPORTS #define MY09DLLDEMO_API __declspec(dllexport) #else #def ...

  4. 第七章 对话框1 windows程序设计 王艳平版

    / // FirstDialog.cpp文件 #include <windows.h> #include "resource.h" BOOL __stdcall Dlg ...

  5. 第三章 windows程序设计 王艳平版

    /// // CountErr.cpp文件 #include <stdio.h> #include <windows.h>  #include <process.h> ...

  6. 第三章 同步 Windows程序设计 王艳平版

    /// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...

  7. 第三章 事件 windows程序设计 王艳平版

    /// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...

  8. 第四章 绘图 windows程序设计 王艳平版

    /// // SineWave.cpp文件 #include <windows.h> #include <math.h> LRESULT __stdcall WndProc(H ...

  9. 创建线程 windows程序设计 王艳平版

    /// // ThreadDemo.cpp文件 #include <stdio.h> #include <windows.h> // 线程函数 DWORD WINAPI Thr ...

最新文章

  1. oracle数据库部署
  2. MATLAB格式化输出控制
  3. Spring依赖检查
  4. MPEG-LA发布VVC专利池
  5. JS数组的迭代器方法
  6. 公众号H5 VUE获取CODE
  7. Android Studio - 如何更改Android SDK路径
  8. Kalman Filter 递归算法
  9. Sequelize 大于_间接效应值大于1是正常的吗?Q群答疑20200405
  10. 3分钟全面了解元数据和数据元
  11. Java工程师 数据结构与算法 数组面试题(Day40)
  12. 3Dmax专用快捷键大全(保姆式手把手教)
  13. SuperMap BIM+GIS-Revit模型处理-背景
  14. 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
  15. C语言入门(八)一维数组
  16. 有介质的高斯定理详细证明(电偶极子模型)以及例题讲解
  17. 福师《大学摄影》在线作业一、二
  18. 三国演义java_三国演义全集高清_java进阶(34)–File类、目录复制
  19. 用金字塔原理看“⑧荣⑧耻”
  20. 腾讯云11·11:千亿订单背后的安全“暗战”

热门文章

  1. 谷歌翻译工具新改版,支持全球51种语言翻译功能
  2. Java实现拼图小游戏(2)——菜单搭建(有关Java中的JMenuBar知识点)
  3. PHP生成IP签名图片的代码,显IP签名图片的秘密
  4. prototype 属性重写对象方法和新定义对象方法
  5. 二、Attack Lab
  6. 关于Page及page的分页问题
  7. 常用的表格检测识别方法——表格结构识别方法 (下)
  8. Linux V4L2子系统-应用层访问video设备(四)
  9. vim显示左边树形目录
  10. Java-jdk下载 (jdk1.6,jdk1.7,jdk1.8,jdk1.9,... 各个版本镜像下载)