静态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. (转载)IQ 16.0 SP02起支持从压缩文件直接装载数据到表中

    参考文档: http://m.blog.chinaunix.net/uid-16765068-id-4405877.htmlhttp://www.cnblogs.com/lichmama/p/4103 ...

  2. AT&T汇编helloworld

    摘自:http://blog.163.com/guixl_001/blog/static/417641042012112102642703/ 代码: #hello.s .data # 数据段声明 ms ...

  3. vue实现对表格数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  4. Struts2框架05 result标签的类型

    1 result标签是干什么的 就是结果,服务器处理完返回给浏览器的结果:是一个输出结果数据的组件 2 什么时候需要指定result标签的类型 把要输出的结果数据按照我们指定的数据类型进行处理 3 常 ...

  5. [CF486D]有效集合-树形dp

    Problem 有效集合 题目大意 给出一棵树,求出这棵树的不同联通子节点集合的数量,这些集合必须满足最大权值点减最小权值点小于等于d. Solution 再一次树d乱搞. 因为数据范围贼小,所以我们 ...

  6. 从源码的角度看Service是如何启动的

    欢迎访问我的个人博客 ,原文链接:http://wensibo.top/2017/07/16/service/ ,未经允许不得转载! 七月中旬了,大家的实习有着落了吗?秋招又准备的怎么样了呢?我依旧在 ...

  7. 谈谈HashMap与HashTable

    谈谈HashMap与HashTable HashMap 我们一直知道HashMap是非线程安全的,HashTable是线程安全的,可这是为什么呢?先聊聊HashMap吧,想要了解它为什么是非线程安全的 ...

  8. Ubuntu安装桌面环境

    1.安装Ubuntu默认的Gnome桌面: sudo apt-get install ubuntu-desktop 2.不安装默认组件,例如Evolution和OpenOffice: sudo apt ...

  9. 初涉算法——C++

    一.sstream头文件运用 题目:输入数据的每行包括若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和. #include<iostream> #include<cstri ...

  10. 【tyvj1463】智商问题 [分块][二分查找]

    Background 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! Description 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有 ...