繁体   English   中英

关键部分和关闭/销毁?

[英]Critical sections and shutdown / destruction?

当您有一个对象OBJ1包含一个临界区CS和一个指向另一个对象OBJ2的指针时,我无法弄清楚什么是正确的关闭程序

假设您有两个功能A和B。

A进入关键部分,修改OBJ2中的数据,然后离开关键部分。 B是关闭/销毁过程,应该破坏一切(OBJ2,CS和OBJ1)

我的问题是:

您如何解决由于B已经输入而A等待进入关键部分的情况? 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--;
}

您可以做的是添加一个开关(整数或您喜欢的任何开关),该开关告知每个功能是否仍然有效/允许更改您的OBJ。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM