Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Потоки и классы


Автор: JekaZZ 8.4.2009, 17:59
Я не понимаю что происходит. Есть базовый класс и 2 производных от него класса. В базовом классе объявленная переменная - тоже класс. Примерно вот так:
//============================
class Device
{
   enum DeviceType {....} ;
   DeviceType m_type;

public:
    DeviceType type() const;
};

Device::DeviceType Device::type() const
{
    return m_type;
}
//============================

class MenuBase
{
   protected:
    Device m_device;
};

class Menu1: public MenuBase
{
};
class Menu2: public MenuBase
{
   private:
    void* thread(void*);
    void exec();
};

//============================

Остальное в классах - не важно. Все это объявлено в различных модулях.

В Menu2::exec() создается pthread поток, выполняющий функцию Menu2::thread();
В этом потоке изменяется переменная  m_device.m_type. И все бы ничего, вот только изменения видны только в этом потоке. Когда же получаешь значение переменной m_device.m_type из главного потока, то ее значение такое же, как будто она и не изменялась. Я уж ее и volatile обзывал, и в классе MenuBase хранил не объект, а указатель на Device, все равно, из главного потока изменения не видны.
Компилятор gcc version 4.2.3



Автор: bel_nikita 8.4.2009, 18:40
Как я понял, у тебя 2 потока Menu1 и Menu2. Каждый MenuХ хранит свою m_device.
Делай так:
Код

class MenuBase
{
   protected:
   static Device m_device;
};

Можно попробывать через virtual public, т.е. class Menu1: virtual public MenuBase{} class Menu2: virtual public MenuBase{}, но как по-мне, то лучше все же через static. 

Также не забывай про синхронизацию! У тебя два потока имеют доступ к m_device - используй критические секции или мьютексы.

Автор: JekaZZ 8.4.2009, 18:57
Ну я и тормоз. Нашел в чем ошибка. С потоками все в порядке. Это я стормозил

Автор: fry 9.4.2009, 01:56
Проблема вроде решена, хотя непонятно как, что имхо не важно, однако применение виртуального наследования целесообразно только в случае ромбовидного характера этого наследования, т.е. если существует некоторый класс, который наследует хотя бы два класса, имеющих общего предка. Таким образом данное решение не поможет. Объявление статическим членом создаст эффект существования одной переменной для всех классов иерархии, что скорее всего не является ожидаемым результатом. А вот про синхронизацию - это на 1000% правильно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)