#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 113 浏览量
2015-11-08
04:00:01
上传
评论
收藏 317KB ZIP 举报
Peter(阿斯拉达)
- 粉丝: 746
- 资源: 60
最新资源
- 奥迪A8D4仪表开机报文
- apache-skywalking-java-agent 8.8.0-9.2.0,一共12个版本
- DTS7001-VB一款SOT23封装P-Channel场效应MOS管
- ZTE-C300 OLT常用命令
- 6666666666666666
- DTS6410-VB一款SOT23封装N-Channel场效应MOS管
- SpyGlass-PowerVerifyMethodology-GuideWare2.0-UserGuide
- DTS6401-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 基于树莓派、OpenCV及Python语言的人脸识别-i
- 游戏开发 UE蓝图 分支(Branch)节点和源码.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈