第三章 线程局部存储 windows程序设计 王艳平版
///
// 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程序设计 王艳平版相关推荐
- 第七章 目录监视 windows程序设计王艳平版
// DirDialog.h文件 #ifndef __DIRDIALOG_H_ #define __DIRDIALOG_H_ #include <shlobj.h> class CDirD ...
- 第七章 控件 windows程序设计王艳平版
/ // PredefineClass.h文件 #define IDC_BUTTON 10 // Button按钮 #define IDC_RADIO 11 // 单选框 #define IDC_CH ...
- 第九章 DLL文件 windows程序设计 王艳平版
// 09DllDemo.h文件 #ifdef MY09DLLDEMO_EXPORTS #define MY09DLLDEMO_API __declspec(dllexport) #else #def ...
- 第七章 对话框1 windows程序设计 王艳平版
/ // FirstDialog.cpp文件 #include <windows.h> #include "resource.h" BOOL __stdcall Dlg ...
- 第三章 windows程序设计 王艳平版
/// // CountErr.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...
- 第三章 同步 Windows程序设计 王艳平版
/// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...
- 第三章 事件 windows程序设计 王艳平版
/// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...
- 第四章 绘图 windows程序设计 王艳平版
/// // SineWave.cpp文件 #include <windows.h> #include <math.h> LRESULT __stdcall WndProc(H ...
- 创建线程 windows程序设计 王艳平版
/// // ThreadDemo.cpp文件 #include <stdio.h> #include <windows.h> // 线程函数 DWORD WINAPI Thr ...
最新文章
- oracle数据库部署
- MATLAB格式化输出控制
- Spring依赖检查
- MPEG-LA发布VVC专利池
- JS数组的迭代器方法
- 公众号H5 VUE获取CODE
- Android Studio - 如何更改Android SDK路径
- Kalman Filter 递归算法
- Sequelize 大于_间接效应值大于1是正常的吗?Q群答疑20200405
- 3分钟全面了解元数据和数据元
- Java工程师 数据结构与算法 数组面试题(Day40)
- 3Dmax专用快捷键大全(保姆式手把手教)
- SuperMap BIM+GIS-Revit模型处理-背景
- 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
- C语言入门(八)一维数组
- 有介质的高斯定理详细证明(电偶极子模型)以及例题讲解
- 福师《大学摄影》在线作业一、二
- 三国演义java_三国演义全集高清_java进阶(34)–File类、目录复制
- 用金字塔原理看“⑧荣⑧耻”
- 腾讯云11·11:千亿订单背后的安全“暗战”
热门文章
- 谷歌翻译工具新改版,支持全球51种语言翻译功能
- Java实现拼图小游戏(2)——菜单搭建(有关Java中的JMenuBar知识点)
- PHP生成IP签名图片的代码,显IP签名图片的秘密
- prototype 属性重写对象方法和新定义对象方法
- 二、Attack Lab
- 关于Page及page的分页问题
- 常用的表格检测识别方法——表格结构识别方法 (下)
- Linux V4L2子系统-应用层访问video设备(四)
- vim显示左边树形目录
- Java-jdk下载 (jdk1.6,jdk1.7,jdk1.8,jdk1.9,... 各个版本镜像下载)