#ifndef THREADLOCALSTORAGE_H
#define THREADLOCALSTORAGE_H
#include <iostream>
#include <memory>
#ifdef _WIN32
#include <windows.h>
#else
#include <pthread.h>
#endif
template<typename T>
class ThreadLocalStorage {
private:
// 根据平台选择适当的线程局部存储机制
#ifdef _WIN32
static DWORD tls_index; // Windows 下的线程局部存储索引
#else
static pthread_key_t tls_key; // POSIX 兼容系统下的线程局部存储键
static void destructor(void* ptr) { // 清理函数,用于释放资源
delete static_cast<T*>(ptr);
}
#endif
// 禁止拷贝和赋值
ThreadLocalStorage(const ThreadLocalStorage&) = delete;
ThreadLocalStorage& operator=(const ThreadLocalStorage&) = delete;
// 静态初始化函数,确保 TLS 只初始化一次
static void ensureInitialized() {
static bool initialized = false;
if (!initialized) {
#ifdef _WIN32
tls_index = TlsAlloc(); // 分配 TLS 索引
if (tls_index == TLS_OUT_OF_INDEXES) {
std::cerr << "Error allocating TLS index" << std::endl;
exit(1);
}
#else
if (pthread_key_create(&tls_key, destructor) != 0) { // 创建 TLS 键并关联清理函数
std::cerr << "Error creating thread local storage key" << std::endl;
exit(1);
}
#endif
initialized = true;
}
}
public:
ThreadLocalStorage() { ensureInitialized(); } // 构造函数中初始化 TLS
~ThreadLocalStorage(); // 析构函数(注意:这里没有实现,但应该包含适当的清理逻辑)
// 赋值运算符,用于设置 TLS 的值
void operator=(T* value) {
#ifdef _WIN32
TlsSetValue(tls_index, value);
#else
pthread_setspecific(tls_key, value);
#endif
}
// 类型转换运算符,用于获取 TLS 的值
operator T*() const {
#ifdef _WIN32
return static_cast<T*>(TlsGetValue(tls_index));
#else
return static_cast<T*>(pthread_getspecific(tls_key));
#endif
}
};
#endif // THREADLOCALSTORAGE_H
这段代码定义了一个模板类
ThreadLocalStorage
,用于跨平台(Windows 和 POSIX 兼容系统,如 Linux)实现线程局部存储(Thread Local Storage, TLS)。线程局部存储允许每个线程拥有该变量的一个独立副本,这些副本之间互不影响。这在多线程编程中非常有用,特别是当每个线程需要维护自己的状态时。