LINUX.ORG.RU

Что будет со статической функцией-потоком, если удалить экземпляр класса?

 


0

1

Здравствуйте.

Подскажите, пожалуйста, ответ на такой вопрос. Я написал класс С++, в котором в качестве метода присутствует статическая функция, которая идёт в качестве параметра в pthread_create. В конструкторе единственного экземпляра класса я создаю этот поток, работаю там с данными-членами класса и глобальными переменными, используя мьютексы для совместно используемых данных, всё работает неплохо, но вот какое дело.

1. Что будет с самим потоком и текущей «точкой исполнения», если во время выполнения этой статической функции-потока произойдёт удаление экземпляра класса из другого потока?

2. Если вся эта конструкция не предусматривает нормального останова и клинапа, но само приложение вообще предназначено для того, чтобы работать на серверной стороне пока работает само железо и падать будет только вместе с ним (выключение или перезапуск приложения не потребуются), то можно ли оставить так или «по хорошему» всегда требуются механизмы перезапуска?

Посоветуйте, пожалуйста, заранее благодарен за конструктив.



Последнее исправление: cetjs2 (всего исправлений: 1)

в деструкторе сигнализируй потоку, что пора на выход и делай join

vvviperrr ★★★★★
()

1. Ничего не будет. Главное, чтобы в этой статической функции не присходло никаких обращений к полям удалённого объекта.

2. Если в программе нет ошибок, приводящих к падению, то ничего более не нужно.

anatoly
()

Что будет с самим потоком и текущей «точкой исполнения»

Ничего не будет, они с объектом никак не связаны. Проблемы начнутся в момент, когда ты попробуешь обратиться к данным, которые, естественно, уже не существуют.

Просто не позволяй другим потокам убивать объект, пока он тебе нужен.

Gvidon ★★★★
()

В добавление к совершенно верно сказанному, тебе бы запретит удаление объекта. Паттерн синглтон тут как раз хорошо подходит.

slovazap ★★★★★
()
Ответ на: комментарий от Gvidon

Очень хорошо, спасибо за ответы. Третий пункт всплывает после ваших уточнений, которые очень в тему и помогли безмерно:

3. Как насчёт такой конструкции в этом случае?

//////////////////
// myClass.h
class myClass {
public:
	void MainThread ( void );
	myClass ( );
	~myClass ( );
private:
    static someStruct *MyStructure;
    
    pthread_t pthr_MyThreadID;
    static void *Thread_Member_Function ( void *vptr_args );
    static void CloseApp ( int );
};

//////////////////
// myClass.cpp

myClass::myClass ( ) {
    this->MyStructure = new someStruct[SOME_VALUE];
    pthread_create ( &pthr_MyThreadID, NULL, Thread_Member_Function, NULL );
};

myClass::~myClass ( ) {
    delete [] this->MyStructure;
};

void myClass::CloseApp ( int iExitCode ) {
    ~myClass ( );
    exit ( iExitCode );
}

void myClass::MainThread ( void ) {
    sleep ( 10 );    CloseApp ( 1 );
};

Я вот так вот делаю, и - я вызываю деструктор из функции-члена класса CloseApp, деструктор уничтожает экземпляр, а возвратиться он должен по-идее назад в CloseApp, которого уже по идее нет? Или он таки есть, всё это сработает так, как я планирую и всё в конце концов дойдёт до exit ( iExitCode )?

Я извиняюсь заранее, если спрашиваю какие-то простые вещи, но мне они по недостатку/отсутствию опыта кажутся нетривиальными. Подскажите, пожалуйста?

shotakoe
() автор топика
Ответ на: комментарий от shotakoe

а возвратиться он должен по-идее назад в CloseApp, которого уже по идее нет

Код для всех объектов класса один, и он сущесвует всё время, пока запущена программа.

anatoly
()
Ответ на: комментарий от shotakoe

У тебя в коде явное непонимание того, что такое статические члены (и данные, и функции). Почитай что-нибудь на эту тему, многие вопросы отпадут сами собой.

Gvidon ★★★★
()
Ответ на: комментарий от shotakoe

короче, поясняю на пальцах: метод method класса Class разворачиваются в примерно такой обычной функции код:

тип.возвр.знач. method(Class* this, формальные параметры)
{
   ...
}
отсюда следует что ты можешь делать все что угодно в методе разрушеного обьекта пока не обращаешься к this

anonymous
()

Работай с этим синглетоном через shared_ptr, как из потока, где этот объект создан, так и из того, который использует его поля. В результате объект будет уничтожен, когда все потоки, его использующие удалят свой shared_ptr на него.

anonymous
()
Ответ на: комментарий от anonymous

Всё работает (поведение) именно так, как вы подсказали. Благодарю всех за потраченное время; все советы пригодились, это очень классно, когда получаешь больше, чем ожидаешь.

shotakoe
() автор топика
Ответ на: комментарий от anonymous

Не совсем так. Он спрашивал про статические функции-члены, а в них никакого this нет, они соответствуют обычным функциям один в один, поэтому их и можно использовать в качестве колбэков со всякими сишными библиотеками.

Gvidon ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.