线程本地存储(Thread Local Storage, TLS)简单分析与使用
在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS, 线程本地存储. 它的使用非常之简单, 只要对变量的声明使用__declspec(thread)就OK了. 下面我来举一个例子, 结合注释, 相信大家马上就能知道其”奥秘”了.
#include "stdafx.h"
#include <stdio.h>
__declspec(thread) int g_nData = 0; //这就是两个线程都要访问的变量
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
g_nData = 5;
//辅线程睡眠100ms, 保证主线程的g_nData = 10; 语句执行成功
Sleep(100);
char szMsg[40] = {0};
sprintf(szMsg, "Auxi thread, g_nData: %d", g_nData);
MessageBox(NULL, szMsg, "AuxiThread", MB_ICONINFORMATION);
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
DWORD dwId;
//创建线程, 并立即启动它
HANDLE hThread = CreateThread(NULL, 1024, ThreadProc, NULL, 0, &dwId);
assert(hThread);
//主线程睡50ms, 保证辅线程的g_nData = 5; 语句执行成功
Sleep(50);
g_nData = 10;
char szMsg[40] = {0};
sprintf(szMsg, "Result: %d", g_nData);
MessageBox(NULL, szMsg, "MainThread", MB_ICONINFORMATION);
return 0;
}
大家自己编译运行这个程序就会发现, 如果不使用TLS, 那么结果都是10; 如果使用TLS, 那么主, 助线程的结果将各不影响. 这下你该知道TLS是怎么回事了吧. J
当然, 更复杂的TLS, 就会需要用到Windows TLS的API: TlsAlloc, TlsFree, TlsSetValue, TlsGetValue了; 进一步还需要同步互斥等等.
分享到:
相关推荐
__declspec(dllexport)和__declspec(dllimport)的区别是什么
C++__declspec关键字详细用法
在win32sdk / c 命令行下用__declspec(dllexport)导出函数名字和全局变量.
C++__declspec关键字详细用法[文].pdf
c++ 中__declspec 的用法如下,想要了解的继续往下看吧。 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值。...
c++中__declspec的用法.pdf
extern "C" __declspec(dllexport) bool TifOpen(char* filename,char* model); extern "C" __declspec(dllexport) bool TifClose(); extern "C" __declspec(dllexport) int GetTifWidth(); extern "C" __declspec...
VC 利用关键字_declspec (dllexport)导出函数,编译后将生成Test.dll文件。。。参考价值更大于使用价值。欢迎下载。没有截图哦,因为只有一个DLL。
摘要:VC/C++源码,其它分类,关键字 VC++使用关键字_declspec (dllexport)导出函数,编译后将生成Test.dll文件。
关于C和C++的兼容问题 如果要写C和C++兼容的DLL,因为在C和C++下使用了不同的名字修饰规则以及不同的调用约定,所以,如果DLL是用C编写和编译的,则在
__declspec(naked) void Direct3DShaderValidatorCreate9() { //跳转到 原来d3d9.dll Direct3DShaderValidatorCreate9 _asm jmp dword ptr [g_Call14+1*4] ; } //2 __declspec(naked) void PSGPError() { _asm ...
两篇关于hough forest and regression forest的论文阅读后写的ppt
动态库编译好了,提供dll,lib,.h.以及测试代码、只需要自己的训练的分类器,网络结构均值,类别就可以试用了
declspec(dllexport)与_declspec(dllimport)的区别