数据结构和设计方面的麻烦,求帮助:)

BT_Dana 2012-10-26 03:24:57
数据结构和接口设计上遇到了麻烦,问题简单抽象如下,希望能得到大家的帮助:

----------------------------------------------------------------------------------------
有一结构体Object_t:
typedef struct
{
... ;
}Object_t;

有一全局数组g_Table:
static Object_t g_Table[5];

给上层提供的三个接口:
CreateObject(u32* ulHandle); //create一个obj,返回给上层的是ulHandle值,实际就是g_Table数组的下标(0,1,2,3,4)
DestroyObject(u32 ulHandle); //销毁一个obj,传入参数为create时返回的ulHandle值
UseObject(u32 ulHandle); //执行一个操作,传入参数为create时返回的ulHandle值


void UseObject(u32 ulHandle)
{
Object_t* pObj = GetObj(ulHandle); //根据ulHandle从g_Table里取得具体的Object_t的地址返回回去

operate1(pObj);
operate2(pObj);
operate3(pObj);
operate4(pObj);

return;
}
----------------------------------------------------------------------------------------

现有结构大致是这样,但是多线程问题越来越严重,在UseObject执行过程中,另外线程可能会随时DestroyObject掉这个Obj,
所以现在想给Object_t内部加个mutex,保护结构体自身。

现在关于加锁,难题主要有俩:
1是怎么能区分两个不同的obj,比如UseObject在执行完operate2(pObj)未执行operate3(pObj)时,被另一个线程destroy掉又重新create,
由于create的原理就是从g_Table里找个空闲的obj返回给上层,所以的ulhandle和原来相同。pObj也也许有效,之前的线程可以继续执行operate3(pObj),
但很明显已经不是之前那个obj了。

2.有的操作需要先unlock再lock,比如
void UseObject(u32 ulHandle)
{
Object_t* pObj = GetObj(ulHandle);

OS_Lock(pObj->hLock);
operate1(pObj);
operate2(pObj);

OS_Unlock(pObj->hLock);
operate3(pObj); //由于operate3(pObj)是阻塞操作,需要暂时unlock,执行完再lock上,但是这时就可能被其它thread操作
OS_Lock(pObj->hLock);

operate4(pObj);
OS_Unlock(pObj->hLock);

return;
}

这种情况,是不是mutex已经不够用了? 比如引用计数什么的解决?
一个是operate3(pObj)执行完后需要重新GetObj(ulHandle),重新检查下该ulHandle还是否合法?
二是一旦unlock, operate3(pObj)本身就已经很不安全了
...全文
106 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧