2014-02-11 3 views
1

Я не могу понять, что правильная процедура выключения, когда у вас есть объект 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--; 
} 
+4

«... уничтожить экземпляр класса ...» Итак, это * не вопрос на языке C? – WhozCraig

+0

, как сказал WhozCraig, не могли бы вы быть более конкретными, потому что, поскольку это не совсем понятно, о чем вы говорите, и некоторый код, отрезанный, также был бы великолепным. –

+0

Это довольно распространенная проблема, вы подумали обо всем, но не заметили выключение программы. Никакого магического решения для этого и часто очень трудно решить, потому что запрос на выход настолько асинхронен.Кроме выхода (0); Укоренился в C++ 11, а также с std :: quick_exit() –

ответ

0

Что вы можете сделать, это добавить переключатель (целое число или что вы предпочитаете), который говорит каждую функцию, если он по-прежнему действителен/позволяет изменять ваш OBJ.

Смежные вопросы