c - 关键部分和关闭/销毁?

原文 标签 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。

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

相关文章:

c - 一些主要因素

c - cs中lseek系统调用的成功

c - C编程比较二维数组的行和列

c - 如何使用C与COM对象进行交互?

windows - 在Windows 7上使用相关DLL运行32位应用程序

windows - pragma 导出函数在 Ada 可执行文件中不是外部的

iphone - 多线程在 iPhone 上的 Objective-C 中是如何工作的?

c - 如何在 C 中修复 ‘memory leak’

java - Java在多个线程上等待,这可能会创建新的线程

c# - 调用 OnPaint 时 Infragistics UltraGrid 上的 "Index was outside the bounds of the array"