#include <iostream>
#include "pthread.h"
#include <assert.h>
#include <Windows.h>
#include <stdio.h>
typedef enum kTLSKey1
{
kTLSKeyCopyFileBuf = 0,
kTLSKeyOthers,
kTLSKeyMax
}kTLSKey;
static pthread_key_t gTLSKey[kTLSKeyMax];
static int gTLSKeySize[kTLSKeyMax] = {4194304,4096};
// 这个只是测试等待线程全部结束用的,和TLS没什么关系.
static pthread_barrier_t barrier = NULL;
static int THREADCOUNT = 10;
// 我们自定义的库提供的接口1
void StartWork(kTLSKey type)
{
pthread_key_t& key = gTLSKey[type];
pthread_key_create(&key,NULL);
}
// 我们自定义的库提供的接口2
void EndWork(kTLSKey type)
{
pthread_key_t& key = gTLSKey[type];
pthread_key_delete(key);
}
// 我们自定义的库提供的接口3
// data参数只是为了证明TLS的变量是绑定线程的.
void MyCopyFile(const char* from, const char* to,void* data)
{
pthread_key_t& key = gTLSKey[kTLSKeyCopyFileBuf];
char* lpvData = (char*)pthread_getspecific(key);
assert(lpvData == data);
Sleep(100);
}
void* ThreadFunc(void* data)
{
int size = gTLSKeySize[kTLSKeyCopyFileBuf];
pthread_key_t& key = gTLSKey[kTLSKeyCopyFileBuf];
char* buf = (char*)malloc(size);
std::cout << GetCurrentThreadId() <<" Create buf size: " << size << ":" << (int*)buf << std::endl;
pthread_setspecific(key, buf); // 申请的内存存放到TLS里.
// 每个线程复制100个文件
for (int i = 0; i < 100; ++i)
{
MyCopyFile("C:\\infoworld.txt","E:\\infoworld.txt",buf);
}
free(buf);
std::cout << "ThreadFunc: " << GetCurrentThreadId() << " finish" << std::endl;
pthread_barrier_wait(&barrier);
return NULL;
}
void TestPthreadLocalStorage()
{
StartWork(kTLSKeyCopyFileBuf); // 在主程序初始化.
pthread_barrier_init(&barrier,NULL, THREADCOUNT+1); // 主线程也是,所以+1
// 模拟 THREADCOUNT 个线程同时调用接口 MyCopyFile.
for (int i = 0; i < THREADCOUNT; ++i)
{
pthread_t t;
pthread_create(&t,NULL,ThreadFunc,NULL);
pthread_detach(t);
}
pthread_barrier_wait(&barrier);
EndWork(kTLSKeyCopyFileBuf); // 在主程序释放.
}
int main(int argc, char const *argv[])
{
setvbuf(stdout,NULL,_IONBF,0);
std::cout << "test thread local storage." << std::endl;
TestPthreadLocalStorage();
std::cout << "end thread local storage." << std::endl;
return 0;
}
[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
5星 · 超过95%的资源 需积分: 1 73 浏览量
2015-11-08
04:00:01
上传
评论
收藏 317KB ZIP 举报
Peter(阿斯拉达)
- 粉丝: 747
- 资源: 60
最新资源
- 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip
- 基于C++/Qt实现的井字棋游戏
- 基于 Python 编程语言的 Web 框架Django
- Python和Flask实现的基于体检数据的城市公共健康可视分析系统源码+使用说明.zip
- 基于python实现的华为智慧工地-安全帽检测
- buck-boost_2023-12-16_12-12-13.eprj
- 后端开发关于数据库和API开发的介绍
- 机器学习和数据挖掘课程设计-米其林餐厅数据挖掘管理系统源码+使用文档说明.zip
- html html html展示我与ai的对化
- 数据结构课程设计-全国交通出行咨询模拟系统C语言实现源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈