darwin之OSRefTable使用

本文介绍了一个使用OSRefTable管理键值对的应用实例。OSRefTable可以高效地处理多线程环境下的键值操作,无需额外加锁。通过EveThread和EventSock类的配合,演示了如何注册、引用及释放元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值