Thread Specific Storage

最近有空翻看了一下ace的网络编程卷1 ,发现ACE在针对线程私有全局变量(TLS)  有更方便使用和移植的一套设计, 命名上稍有区别Thread Specific Storage(TSS)

在原有各OS TSS API的封装基础上 ,增加了使用上的方便 使用C++ 的 委托(delegation) 运算符 operator->() 让代码时显得编写更自然

ACE_TSS 实现为一个模板 

ACE_TSS
- keylock_ : ACE_Thread_Mutex
- once_ : int
- key_ : ACE_thread_key_t
+ operator->() : TYPE*
- cleanup(ptr : void* )


template <class TYPE> TYPE*  ACE_TSS<TYPE>::operator->(){
if(once_ == 0) {
     ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, keylock_,0);
    if(once_ == 0) {
      ACE_OS::thr_keycreate(&key_,&ACE_TSS::cleanup);
      once_ = 1;
   }
}
TYPE *ts_obj = 0;
ACE_OS::thr_getspecific(key_,(void**) &ts_obj);
if(ts_obj ==0) {
   ts_obj = new TYPE;
   ACE_OS::thr_setspecific(key_,ts_obj);
return ts_obj;
}
其实里面执行的操作流程还是和TLS一样, 先create 把清理数据的操作cleanup注册,然后尝试get 不行就set 。需要注意的是实现上
if(ts_obj ==0)
的时候并没有加锁, 因为在
ACE_OS::thr_setspecific
的时候key_已经是每个线程之间分离了,即使ts_obj在同一时刻new 了多个,也会被set到其各自执行线程的key_里

使用:

class tss_value_test
{
private:
int count;
public:
void increment();
itn value() const { return count;}
};

static ACE_TSS<tss_value_test> ts_vt;

.....
.....
void thread_func
{
...
ts_vt.increment();
cout << ts_vt.value();
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值