![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| JekaZZ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Как я понял, у тебя 2 потока Menu1 и Menu2. Каждый MenuХ хранит свою m_device.
Делай так:
Можно попробывать через virtual public, т.е. class Menu1: virtual public MenuBase{} class Menu2: virtual public MenuBase{}, но как по-мне, то лучше все же через static. Также не забывай про синхронизацию! У тебя два потока имеют доступ к m_device - используй критические секции или мьютексы. |
|||
|
||||
| JekaZZ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 6.10.2005 Репутация: нет Всего: 3 |
Ну я и тормоз. Нашел в чем ошибка. С потоками все в порядке. Это я стормозил
|
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Проблема вроде решена, хотя непонятно как, что имхо не важно, однако применение виртуального наследования целесообразно только в случае ромбовидного характера этого наследования, т.е. если существует некоторый класс, который наследует хотя бы два класса, имеющих общего предка. Таким образом данное решение не поможет. Объявление статическим членом создаст эффект существования одной переменной для всех классов иерархии, что скорее всего не является ожидаемым результатом. А вот про синхронизацию - это на 1000% правильно.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |