C++【线程局部存储TLS机制】动态TLS

#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)。线程局部存储允许每个线程拥有该变量的一个独立副本,这些副本之间互不影响。这在多线程编程中非常有用,特别是当每个线程需要维护自己的状态时。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值