静态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 通常称为调试版本,它包含调试信息,并且不 ...
随机推荐
- 孤儿文档是怎样产生的(MongoDB orphaned document)
使用MongoDB的开发人员应该都听说过孤儿文档(orphaned document)这回事儿,可谓闻着沉默,遇者流泪.本文基于MongoDB3.0来看看怎么产生一个orphaned document ...
- 互联网级监控系统必备-时序数据库之Influxdb
时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列. 时序数据库到底能用到什么业务场景,答案是:监控系统. Baidu一 ...
- spring注解@service("service")括号中的service有什么用
相当于 xml配置中得 bean id = service 也可以不指定 不指定相当于 bean id = com. service.service 就是这个类的全限定名 好处是:同一个接口可以有多个 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- requirejs 加载其它js
基本代码: require.config({ // baseUrl : '/js/' paths: { jquery: '/js/jquery-1.11.3.min', validate: '/js/ ...
- CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu?
CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu? Description (原题来自刘汝佳<训练指南>Pa ...
- Spark的误解-不仅spark是内存计算,hadoop也是内存计算
市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性.请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据 ...
- 初学angular
1.angular 表达式 2.ng-app ng-init ng-model ng-repeat ng-model是用于表单元素的,支持双向绑定.对普通元素无效: ng-bind用于普通 ...
- 还在为画“类Word文档报表”而发愁吗?
欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ Word 是非常强大的文档编辑工具,一些行业制式文档都是使用Word来创建的,像教育行业的申请表,履历表,审批表等,像石油业的 ...
- Java 9 揭秘(15. 增强的弃用注解)
Tips 做一个终身学习的人. 主要介绍以下内容: 如何弃用API @deprecate Javadoc标签和@Deprecation注解在弃用的API中的角色 用于生成弃用警告的详细规则 在JDK ...