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();
}





猜你喜欢

转载自blog.csdn.net/evilswords/article/details/9127161