Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки и классы 
:(
    Опции темы
JekaZZ
Дата 8.4.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 6.10.2005

Репутация: нет
Всего: 3



Я не понимаю что происходит. Есть базовый класс и 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



PM MAIL   Вверх
bel_nikita
Дата 8.4.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Как я понял, у тебя 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 - используй критические секции или мьютексы.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
JekaZZ
Дата 8.4.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 6.10.2005

Репутация: нет
Всего: 3



Ну я и тормоз. Нашел в чем ошибка. С потоками все в порядке. Это я стормозил
PM MAIL   Вверх
fry
Дата 9.4.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Проблема вроде решена, хотя непонятно как, что имхо не важно, однако применение виртуального наследования целесообразно только в случае ромбовидного характера этого наследования, т.е. если существует некоторый класс, который наследует хотя бы два класса, имеющих общего предка. Таким образом данное решение не поможет. Объявление статическим членом создаст эффект существования одной переменной для всех классов иерархии, что скорее всего не является ожидаемым результатом. А вот про синхронизацию - это на 1000% правильно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.