关键部分和关闭/销毁?

标签 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/

相关文章:

sql - 如何检查 ODBC 通信,以查看正在传递的 SQL?

ruby - 如何使用 ruby​​ 在注册表中添加新的双字(32 位)值?

windows - x64 native 工具命令提示符和 x64 交叉工具命令提示符有什么区别?

java - 如何处理 Java 8 CompletableFuture 中的错误?

具有 ConcurrentModificationException 的 Java 线程

计算数字、空格和其他字符

java - NDK 与 JNI 同时调用返回类型为非原始类型的方法

java - 信号量被多次中断的问题

c++ - 将 char 数组分配给另一个 char 数组

c++ - C/C++ 中的 BST super 节点生成