如何将一个对象关联到OSRefTable中?
OSRefTable中维护了OSRefHashTable变量。
创建一个对象,这个对象内部要包含一个key即可。key的类型为StrPtrLen,同时要有一个OSRef变量,并在该变量初始化时将StrPtrLen初始化到OSRef即可。
这样通过OSRef既能查找到key,又能引用到该对象的this,同时还能获取引用计数。
“`
class A
{
public:
A(char* uid):m_ref(StrPtrLen(uid),this){}
OSRef m_ref;
void GetRefCount()
{
printf("ref count:%d\n",m_ref.GetRefCount());
}
};
int main()
{
Init();
char *pUid = "aaaaaaaaaaaaaaaaaaaaaaa";
StrPtrLen ptrId(pUid);
A a(pUid);
OSRefTable table;
if (table.Resolve(&ptrId) == NULL)
{
//注册
table.Register(&a.m_ref);
}
for (int i =0; i < 10 ; i++)
{
OSMutexLocker locker(table.GetMutex());
//引用计数增加1
OSRef*pRef = table.Resolve(&ptrId);
//获取对象this指针,调用成员函数
((A*)pRef->GetObjectPtr())->GetRefCount();
//printf("osref count:%d\n",pRef->GetRefCount());
}
while(1)
{
OSMutexLocker locker(table.GetMutex());
int ncount = a.m_ref.GetRefCount();
printf("============count:%d\n",ncount);
if (ncount > 0)
table.Release(&a.m_ref);
if (ncount == 0)
{
table.UnRegister(&a.m_ref);
break;
}
}
int iii = 0;
“`