Я не могу понять, что правильная процедура выключения, когда у вас есть объект obj1, который содержит критическую секцию CS и указатель на другой объект obj2Критические разделы и остановка/разрушение?
у вас есть две функции A и B.
А входит в критический раздел, изменяет данные в OBJ2 и оставляет критический раздел. B является процедура закрытия/уничтожения и должен уничтожить все (obj2, CS и obj1)
Мой вопрос:
Как вы решаете сценарий где ждет, чтобы войти в критическую секцию, потому что 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 и экземпляр У. переменной точки '' 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 может нормально выполняться, не вызывая проблем. Каково решение этого?
EDIT:
Может быть, мне нужно какое-то "блокировка" подсчитывать; то есть счетчик, который увеличивается на 1, когда некоторый код входит в критический раздел и уменьшается, когда код выходит из критического раздела? Если бы у меня было это, то процедура останова могла бы проверять счетчик, чтобы увидеть, превышает ли он 1 (что указывает на то, что какой-то другой код ждет, чтобы войти в критический раздел), и если счетчик> 1, тогда он может спать до тех пор, пока счет не пройдет обратно к 1. Итак, вот что я предлагаю:
Каждая функция делает это:
void someFunction(...)
{
if (thisClassX == NULL) return;
thisClassX->counter++;
EnterCriticalSection(thisClassX->cs);
/* do something */
LeaveCriticalSection(thisClassX->cs);
thisClassX->counter--;
}
«... уничтожить экземпляр класса ...» Итак, это * не вопрос на языке C? – WhozCraig
, как сказал WhozCraig, не могли бы вы быть более конкретными, потому что, поскольку это не совсем понятно, о чем вы говорите, и некоторый код, отрезанный, также был бы великолепным. –
Это довольно распространенная проблема, вы подумали обо всем, но не заметили выключение программы. Никакого магического решения для этого и часто очень трудно решить, потому что запрос на выход настолько асинхронен.Кроме выхода (0); Укоренился в C++ 11, а также с std :: quick_exit() –