静态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的更多相关文章

  1. 线程本地存储(动态TLS和静态TLS)

    线程本地存储(TLS) 对于多线程应用程序,如果线程过于依赖全局变量和静态局部变量就会产生线程安全问题.也就是一个线程的使用全局变量可能会影响到其他也使用此全局变量的线程,有可能会造成一定的错误,这可 ...

  2. HTTPS 传输优化详解之动态 TLS Record Size

    笔者在过去分析了诸多可以减少 HTTPS 传输延迟的方法,如分布式 Session 的复用: 启用 HSTS,客户端默认开启 HTTPS 跳转:采用 HTTP/2 传输协议:使用 ChaCha20-P ...

  3. Apache静态编译与动态编译详解

    Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的“动态”和“静态”两种编译安装方式: 静态编译: 编译的时 ...

  4. Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)

    Android GradientDrawable使用优势: 1. 快速实现一些基本图形(线,矩形,圆,椭圆,圆环) 2. 快速实现一些圆角,渐变,阴影等效果 3. 代替图片设置为View的背景 4. ...

  5. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  6. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

  7. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  8. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  9. VS中Debug和Realease、及静态库和动态库的区别整理(转)

    原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...

随机推荐

  1. Linux之虚拟机网络配置

    一般安装完虚拟机后,VMware会为虚拟机在网络连接配置为“NAT模式(N):用于共享主机的IP地址”. 这种模式下虚拟机会共享主机的网络环境,主机可以访问外网那么虚拟机可以,主机可以(哪怕是拨VPN ...

  2. 工厂设计模式 Factory

    Factory 主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 例如:汽车销售商场 该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创建对象,该模 ...

  3. 掌握好这23个Linux命令常用项

    运维工程师(Operations)在国内又称为运维开发工程师(Devops),在国外称为 SRE(SiteReliability Engineering).负责维护并确保整个服务的高可用性,同时不断优 ...

  4. Python如何实现单步调试

    遇到大型python项目,如何定位问题和监控程序的运行状态是一个程序员必须掌握的技能,今天小编为你带来python程序的单步调试方法,方便易用,简单易记! 首先你需要在所调试程序的开头中:import ...

  5. Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划)

    Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划) Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m ...

  6. CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

    CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划) Description 字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因 ...

  7. 字符的读写函数:fgetc()和fputc()

    fgetc();    功能:    从文件中读取字符.    头文件:  #include <stdio.h>    函数原型:int fgetc(FILE *stream);    返 ...

  8. QTCreator 更改代码高亮主题为 VS+VA助手 风格

    VS Dark-VA 主题下载地址    链接:http://pan.baidu.com/s/1jIOeZxc 密码:2gp2 另外还有喜欢 solarized 配色的也可以从这里下载   https ...

  9. 一大波jQuery事件即将来袭!

    一.jQuery事件 1.focus()元素获得焦点 2.blur()元素失去焦点 3.change() 表单元素的值发生变化(可用于验证用户名是否存在) 4.click() 鼠标单击 5.dbcli ...

  10. poj_2186: Popular Cows(tarjan基础题)

    题目链接 tarjan参考博客 本文代码参考博客 题意:求在图上可以被所有点到达的点的数量. 首先通过tarjan缩点,将所有内部两两可达的子图缩为一点,新图即为一个有向无环图(即DAG). 在这个D ...