当你有一个对象OBJ1包含一个关键部分CS和一个指向另一个对象OBJ2的指针时,我无法弄清楚正确的关闭程序是什么
假设您有两个功能A和B.
A进入临界区,修改OBJ2中的数据并离开临界区。 B是一个关闭/销毁程序,应该销毁所有东西(OBJ2,CS和OBJ1)
我的问题是:
如何解决A等待进入临界区的情况,因为B已进入该区域? B会摧毁一切。如果'破坏'(由于一些有趣的原因)导致/允许A进入临界区,那么A将生成异常,因为它正在尝试访问不再存在的对象。如果'破坏'不会导致A进入临界区,那么A只会挂起,等待进入临界区。
破坏包含临界区和指向对象的指针的类实例的正确方法是什么?
对我而言,似乎唯一的解决方案是将关键部分作为全局变量,而数据可以放在“类”(结构)中......但我不喜欢这个解决方案!
我使用的语言是C.我知道你没有C语言的课程。我有结构实例。
示例:
typedef struct classX_t
{
CRITICAL_SECTION cs;
classY* thisY;
} classX;
typedef struct classY_t
{
int some_variable;
} classY;
我创建了一个X实例和一个Y实例。变量'thisY'指向Y的实例。我的两个函数是:
void funcA(classX* thisClassX)
{
if (thisClassX == NULL) return;
EnterCriticalSection(thisClassX->cs);
thisClassX->thisY->some_variable++;
LeaveCriticalSection(thisClass->cs);
}
void funcB(classX* thisClassX)
{
if (thisClassX == NULL) return;
EnterCriticalSection(thisClassX->cs);
/* free stuff here */
free(thisClassX->thisY);
DeleteCriticalSection(thisClass->cs);
/* and destroy instance */
free(thisClassX)
}
如果funcA等待进入临界区,因为B已经进入临界区,那么我没有看到funcA如何正确执行而不会引起问题。解决方案是什么?
编辑:
也许我需要某种“锁定”计数;即一个计数器,当某些代码进入临界区时递增1,当代码离开临界区时递减计数器?如果我有,那么关机程序可以检查计数是否大于1(表示其他一些代码正在等待进入临界区),如果计数是> 1然后它可以睡觉,直到计数回落到1.所以这就是我的建议:
每个功能都这样做:
void someFunction(...)
{
if (thisClassX == NULL) return;
thisClassX->counter++;
EnterCriticalSection(thisClassX->cs);
/* do something */
LeaveCriticalSection(thisClassX->cs);
thisClassX->counter--;
}
答案 0 :(得分:0)
你可以做的是添加一个开关(一个整数或你喜欢的任何东西),它告诉每个函数它是否仍然有效/允许改变你的OBJ。