![](/img/trans.png)
[英]Correct way to shutdown C application to ensure CRITICAL sections completed?
[英]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.