关键部分和关闭/销毁?

标签 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--;
}

最佳答案

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

关于关键部分和关闭/销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21695734/

相关文章:

windows - 在 Windows 上运行 katalon docker

python - Gunicorn Django 线程

c# - 如何将 QueueUserWorkItem 与 ref/out 状态一起使用?

c - 从 GDB 的 python 交互模式中读取/写入变量/符号

linux - Linux 中 t32.exe 文件的用途是什么?

c - 递归 C 函数

c# - 标题栏不可点击 Form.TransparencyKey = White

c# - WP8 : Dispatcher. BeginInvoke 不在 UI 线程上执行操作

c - 如何正确引用 C 中的两个结构?

c - 以编程方式并行化 C 程序的一部分