![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
DoctorSwat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.4.2013 Репутация: нет Всего: нет |
Всем привет! Столкнулся с такой проблемой. Даже не проблема, а просто непонимание того, что происходит. Имею что-то вроде этого:
По задумке, после вызова wait(false), должен запуститься бесконечный цикл, который остановит главный поток, а в конце работы второго потока поменяется значение event_state и главный поток перестанет висеть, а второй прекратится. Но почему-то это не работает и главный поток прекращает свою работу сразу после создания второго. Если вместо wait() поставить просто бесконечный цикл в потоке, а не в функции класса, то всё работает. Кому не сложно, объясните: почему так происходит и что нужно сделать чтобы мой класс работал правильно. Заранее спасибо! |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
DoctorSwat, привет.
Во-первых: так с потоками работать нельзя, ты используешь обычный bool, в который пишешь\читаешь из разных потоков, а это уже даёт неопределённый результат. Используй блокирующие механизмы или atomic. Во-вторых: ты используешь swap в своеё функции, который выставит event_state=true и когда ты попадаешь в wait оно просто выходит, т.к. true == true. |
|||
|
||||
DoctorSwat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.4.2013 Репутация: нет Всего: нет |
Ну так в этом и задумка, главный поток будет блочиться, пока не поменяется значение, а оно поменяется только в конце второго потока. Про блокирующие механизмы почитаю, спасибо!
Добавлено через 14 минут и 32 секунды Как я понял из примера с cppreference, можно использовать атомарный тип, что-то вроде этого:
Качаю новую студию для поддержки C++11... Спасибо за наводку! |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
DoctorSwat, нет, не правильно. Тебе нужно атомарное изменение event_state, именно его нужно делать атомарным.
Посмотри мою статью, там разбирается работа с atomic. Кроме того там немного рассмотрены "гонки", которые ты имеешь сейчас. Это сообщение отредактировал(а) vinter - 7.3.2014, 13:28 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |