darwin之OSRefTable使用

来源:互联网 发布:王者荣耀抽奖活动源码 编辑:程序博客网 时间:2024/06/12 10:46

在OSRefTable里面可以管理map(一组键值对),(key)键是一个唯一的字符串,而(value)值可以是任何类型。而key,value通过OSRef来设置,
OSRefTable只需要管理OSRef即可。
OSRefTable可以在多个线程中处理而不需要加锁,因为其内部维护了锁。
fRefTable.Register注册元素。
OSRef* ref = fRefTable.Resolve(&idStr);引用元素,引用完毕一定要记得释放 
 fRefTable.Release(ref);释放元素
fEventThread->fRefTable.UnRegister(&fRef);注销元素,需要所有引用全部释放完毕才可以释放。



class EventSock;int   g_flag = -1;class EveThread :public OSThread{public:EveThread():OSThread() {}virtual ~EveThread() {}private:virtual     void            Entry();private:OSRefTable      m_RefTable;friend class EventSock;};class EventSock{public:static void Initialize(){sEventThread = new EveThread();sEventThread->Start();}EventSock(int index):m_sKey((char*)&index,sizeof(index)){m_ref.Set(m_sKey, this);sEventThread->m_RefTable.Register(&m_ref);m_nIndex = index;}void   SetFlag(){g_flag = m_nIndex;}int   GetFlag(){return m_nIndex;}private:OSRef   m_ref;StrPtrLen  m_sKey;int        m_nIndex;static EveThread *sEventThread;};EveThread *EventSock::sEventThread = NULL;void EveThread::Entry(){while (true){if (g_flag != -1){StrPtrLen ptr((char*)&g_flag, sizeof(int));OSRef *pRef = m_RefTable.Resolve(&ptr);if (pRef != NULL){EventSock *pSock = (EventSock*)pRef->GetObjectPtr();printf("===============%d\n", pSock->GetFlag());g_flag = -1;}else{printf("error\n");}}OSThread::Sleep(100);}}int main(){Init();EventSock::Initialize();for (int i = 0; i < 100; i++){EventSock *p = new EventSock(i);p->SetFlag();OSThread::Sleep(1000);}


原创粉丝点击