关键部分和关闭/销毁?

时间:2014-02-11 07:33:07

标签: c windows multithreading mutex critical-section

当你有一个对象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--;
}

1 个答案:

答案 0 :(得分:0)

你可以做的是添加一个开关(一个整数或你喜欢的任何东西),它告诉每个函数它是否仍然有效/允许改变你的OBJ。