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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните два случая. 
:(
    Опции темы
DoctorSwat
Дата 7.3.2014, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Столкнулся с такой проблемой. Даже не проблема, а просто непонимание того, что происходит. Имею что-то вроде этого:
Код



class user_event
{
    public:

        user_event(){event_state=false;}
        user_event(bool state){event_state=state;}
        int getstate(){return event_state;}
        void setstate(bool state){event_state=state;}
        void swaps()
        {
            if(!event_state){event_state=true;}
            else{event_state=false;}
        }
        
        void wait(bool we)
        {
            for(;;){if(getstate()==we){break;}}
        }

    private:

        bool event_state;
};


user_event thread_block(false);

void re(void *p)
{
   //Do something
    thread_block.swaps();
    return 0;
}

int main()
{
   //Do something
    _beginthread(re,0,0);
    thread_block.wait(true);
    system("pause");
    return 0;
}


По задумке, после вызова wait(false), должен запуститься бесконечный цикл, который остановит главный поток, а в конце работы второго потока поменяется значение event_state и главный поток перестанет висеть, а второй прекратится. Но почему-то это не работает и главный поток прекращает свою работу сразу после создания второго.
Если вместо wait() поставить просто бесконечный цикл в потоке, а не в функции класса, то всё работает.
Кому не сложно, объясните: почему так происходит и что нужно сделать чтобы мой класс работал правильно. Заранее спасибо!  
PM MAIL   Вверх
vinter
Дата 7.3.2014, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



DoctorSwat, привет.

Во-первых: так с потоками работать нельзя, ты используешь обычный bool, в который пишешь\читаешь из разных потоков, а это уже даёт неопределённый результат. Используй блокирующие механизмы или atomic.

Во-вторых: ты используешь swap в своеё функции, который выставит event_state=true и когда ты попадаешь в wait оно просто выходит, т.к. true == true.


--------------------
Мой блог
PM MAIL WWW   Вверх
DoctorSwat
Дата 7.3.2014, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну так в этом и задумка, главный поток будет блочиться, пока не поменяется значение, а оно поменяется только в конце второго потока. Про блокирующие механизмы почитаю, спасибо!

Добавлено через 14 минут и 32 секунды
Как я понял из примера с cppreference, можно использовать атомарный тип, что-то вроде этого:
Код

std::atomic<user_event> thread_block(false);

Качаю новую студию для поддержки C++11...
Спасибо за наводку!
PM MAIL   Вверх
vinter
Дата 7.3.2014, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



DoctorSwat, нет, не правильно. Тебе нужно атомарное изменение event_state, именно его нужно делать атомарным. 
Посмотри мою статью, там разбирается работа с atomic. Кроме того там немного рассмотрены "гонки", которые ты имеешь сейчас.

Это сообщение отредактировал(а) vinter - 7.3.2014, 13:28


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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