静态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 通常称为调试版本,它包含调试信息,并且不 ...
随机推荐
- [CF161D]Distance in Tree-树状dp
Problem Distance in tree 题目大意 给出一棵树,求这棵树上有多少个最短距离为k的点对. Solution 这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树 ...
- PHP中的数据结构
PHP7以上才能安装和使用数据结构,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置 Coll ...
- async 函数
同步 console.log(1); console.log(2); console.log(3); console.log(4); //异步 ajax 文件读取io操作 console.log(1) ...
- vue vuex的用法
1.引入 vue.js vuex.js 文件 2.创建Store文件 var sSatte=new Vuex.Store({ state:{}, mutations:{}, actions:{ ...
- [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]
题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...
- Docker进阶使用1
容器间共享文件 Docker 的容器和外部环境是相对隔离的,并且容器是一次性的,运行结束后并不会有任何的持久化的文件或者数据.所以当我们需要做应用数据的持久化,或者保留应用的日志文件时,我们需要用到 ...
- (转)Linux命令grep
场景:grep命令在文件搜索中经常会使用到,所以熟练掌握该命令对于日常日志搜索相当有必要! Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.g ...
- Opencv-2017-7-18
橘子薄皮只吃瓤,可以称之为过滤,意思是只要我们需要的东西,去除不需要的. 图像灰度级的分布及变化. 空间域(分布)和频域(变化). 低频(变化小),高频,水平/垂直,(高/低通滤波器). 低频-类似模 ...
- 深入浅出数据结构C语言版(10)——树的简介
到目前为止,我们一直在谈论的数据结构都是"线性结构",不论是普通链表.栈还是队列,其中的每个元素(除了第一个和最后一个)都只有一个前驱(排在前面的元素)和一个后继(排在后面的元素) ...
- 【SignalR学习系列】4. SignalR广播程序
创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...