×
Namespaces

Variants
Actions

如何使用线程局部存储(TLS)来实现一个单独的类

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
huwell 在 29 Jun 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑
  • 设备, 软件 版本:

S60 1.0/2.0


  • 说明:

下列代码演示了一个单独的对象,它的NewL函数利用TLS来测试自身类型的对象是否被生成过。如果是,则返回存储在TLS中的指针(将其转换为自身类型),如果没有,则它将实例化一个自身类型的对象,并将指针存储在TLS中,并返回它。

注意这里假设没有其他类在这个DLL中(该DLL包含了使用TLS的类),如果不是这样,则必须写一个单独的管理类,它使用TLS存储一个结构指针,其指向所有程序中需要的单独类。

Example 1: Singleton implementation based on TLS
 
==============
 
CMySingleton.h
 
==============
 
 
 
class CMySingleton : public CBase
{
public: // constructor and destructor
 
static CMySingleton* NewL();
 
virtual ~CMySingleton();
 
private: // constructors
 
CMySingleton(); // private because of the singleton pattern; it is
 
// guaranteed that only NewL will call it
 
void ConstructL();
 
public: // other functions
 
...
 
private: // other functions
 
...
 
private: // data
 
...
}
 
 
 
================
 
CMySingleton.cpp
 
================
 
 
 
CMySingleton::CMySingleton* NewL()
{
CMySingleton* singleton;
 
// Check thread local storage:
 
if ( Dll::Tls() == NULL )
{
 
// TLS is still null, which means that no CMySingleton has
 
// been instantiated yet. Do so now, and return that
 
// instance:
 
singleton = new ( ELeave ) CMySingleton();
 
CleanupStack::PushL( singleton );
 
singleton->ConstructL();
 
CleanupStack::Pop( singleton );
 
// Store a pointer to the new instance in thread local storage:
 
TInt err = Dll::SetTls( static_cast<TAny*>( singleton ) );
 
if ( err == KErrNone )
 
{
 
return singleton;
 
}
 
else
 
{
 
delete instance;
 
User::Leave( err );
 
return NULL;
 
}
 
}
 
else
 
{
 
// CMySingleton has been instantiated once already, so return
 
// that instance:
 
singleton = static_cast<CMySingleton*>( Dll::Tls() );
 
return singleton;
 
}
}

(著名的 helix播放器 就使用了这个技术)

This page was last modified on 15 December 2011, at 13:45.
53 page views in the last 30 days.
×