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