静态TLS和动态TLS
静态TLS的使用方法:
#include <Windows.h>
#include <iostream>
#include <iomanip>
using namespace std; CRITICAL_SECTION g_cs; // 定义静态TLS全局变量
__declspec(thread) int value = ; DWORD WINAPI NewThread ( LPVOID lParam )
{
// 设置子线程value为10,并不影响主线程
value = ; int array[];
for (int loop = ; loop < ; loop++)
{
array[loop] = value++;
} DWORD dwThreadID = GetCurrentThreadId(); EnterCriticalSection(&g_cs);
for (loop = ; loop < ; loop++)
{
// 取得子线程静态TLS的值
cout << "子线程 0x" << setw() << setfill('') << hex << dwThreadID;
cout << " value=" << dec << array[loop] << endl ;
}
cout << endl;
LeaveCriticalSection(&g_cs); return ;
} #define THREAD_NUM 3 int main(int argc, char* argv[])
{
InitializeCriticalSection(&g_cs); // 设置主线程静态TLS的value为5
value = ;
// 创建子线程
HANDLE hThread[THREAD_NUM]; for (int loop = ; loop < THREAD_NUM; loop++)
{
hThread[loop] = CreateThread ( NULL, , NewThread, NULL, , NULL ) ;
} // 等待直到子线程结束
WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE);
// 取得主线程静态TLS的值
cout << "主线程 0x" << setw() << setfill('') << hex << GetCurrentThreadId();
cout << " value=" << dec << value << endl ; DeleteCriticalSection(&g_cs); return ;
}
动态TLS的使用方法:
#include <windows.h>
#include <iostream>
#include <iomanip>
using namespace std ; CRITICAL_SECTION g_cs; // 全局变量保存TLS时隙索引值
// 约定所有线程都使用TLS的这个时隙
UINT nTlsIndex = ; DWORD WINAPI NewThread ( LPVOID lParam )
{
int value = ;
int array[];
for (int loop = ; loop < ; loop++)
{
// 设置子线程TLS值
TlsSetValue ( nTlsIndex, (LPVOID)value) ;
array[loop] = (int)TlsGetValue(nTlsIndex );
value++;
} DWORD dwThreadID = GetCurrentThreadId(); EnterCriticalSection(&g_cs);
for (loop = ; loop < ; loop++)
{
// 取得子线程静态TLS的值
cout << "子线程 0x" << setw() << setfill('') << hex << dwThreadID;
cout << " value=" << dec << array[loop] << endl ;
}
cout << endl;
LeaveCriticalSection(&g_cs); return ;
} #define THREAD_NUM 3 int main(int argc, char* argv[])
{
InitializeCriticalSection(&g_cs); // 动态分配TLS时隙
nTlsIndex = TlsAlloc() ;
if ( nTlsIndex != TLS_OUT_OF_INDEXES )
{
cout << "TLS时隙为" << nTlsIndex << endl ; // 主线程TLS指定时隙的值
TlsSetValue ( nTlsIndex, (LPVOID) ) ; // 创建子线程
HANDLE hThread[THREAD_NUM];
for (int loop = ; loop < THREAD_NUM; loop++)
{
hThread[loop] = CreateThread ( NULL, , NewThread, NULL, , NULL ) ;
} // 等待直到子线程结束
WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE);
// 取得主线程静态TLS的值
cout << "主线程 0x" << setw() << setfill('')<< hex << GetCurrentThreadId() << endl;
cout << dec << nTlsIndex << "号TLS时隙值为" << (DWORD)TlsGetValue(nTlsIndex ) << endl; // 不使用时应该释放TLS时隙
TlsFree ( nTlsIndex ) ;
}
else
{
cout << "没有可用的TLS时隙!" << endl ;
}
return ;
}
静态TLS和动态TLS的更多相关文章
- 线程本地存储(动态TLS和静态TLS)
线程本地存储(TLS) 对于多线程应用程序,如果线程过于依赖全局变量和静态局部变量就会产生线程安全问题.也就是一个线程的使用全局变量可能会影响到其他也使用此全局变量的线程,有可能会造成一定的错误,这可 ...
- HTTPS 传输优化详解之动态 TLS Record Size
笔者在过去分析了诸多可以减少 HTTPS 传输延迟的方法,如分布式 Session 的复用: 启用 HSTS,客户端默认开启 HTTPS 跳转:采用 HTTP/2 传输协议:使用 ChaCha20-P ...
- Apache静态编译与动态编译详解
Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的“动态”和“静态”两种编译安装方式: 静态编译: 编译的时 ...
- Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)
Android GradientDrawable使用优势: 1. 快速实现一些基本图形(线,矩形,圆,椭圆,圆环) 2. 快速实现一些圆角,渐变,阴影等效果 3. 代替图片设置为View的背景 4. ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
随机推荐
- VB6之摄像头控制
参考文献:http://www.cnblogs.com/xidongs/archive////.html 直接上代码: 'code by lichmama from cnblogs.com '@vb6 ...
- Struts 之 通配符 路径匹配 常量用法 配置默认值
Struts 框架学习 Action的开发的几种方式 方式1 : 继承ActionSupport 如果使用Struts校验功能,必须继承此类 方式2 : 实现Action接口 方式3 :不继承 ...
- 访问Access日期字段
在使用sql访问Access日期字段,应在变量前后加#,例子: s:=Format(select xueshID,name,times,qukbz,skdate,banji from dianmjil ...
- Struts2+Spring+Hibernate+Jbpm技术实现Oa(Office Automation)办公系统第一天框架搭建
=============编码规范,所有文健,所有页面,所有数据库的数据表都采用UTF-8编码格式,避免乱码:===========开发环境:jdk1.7+tomcat8.0+mysql5.7+ecl ...
- Python如何实现单步调试
遇到大型python项目,如何定位问题和监控程序的运行状态是一个程序员必须掌握的技能,今天小编为你带来python程序的单步调试方法,方便易用,简单易记! 首先你需要在所调试程序的开头中:import ...
- Android 自定义帧动画
Android 自定义帧动画 Android L : Android Studio 帧动画 和gif图片类似,顺序播放准本好的图片文件:图片资源在xml文件中配置好 将图片按照预定的顺序一张张切换,即 ...
- PHP对MySQL数据库的相关操作
一.Apache服务器的安装 <1>安装版(计算机相关专业所用软件---百度云链接下载)-直接install<2>非安装版(https://www.apachehaus.com ...
- MySQL慢查询日志分析
一:查询slow log的状态,如示例代码所示,则slow log已经开启. mysql> show variables like '%slow%'; +-------------------- ...
- JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.c ...
- tomcat内存溢出之PermGen space
线上一台web服务器不能正常访问了,检查了一下,tomcat进程还在,就是web不能正常访问,重启一下tomcat恢复正常,查询日志,发现提示内存溢出,如下图: java.lang.OutOfMemo ...