Russian Qt Forum
Ноябрь 22, 2024, 14:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение данных одного потока другим  (Прочитано 3361 раз)
JamS007
Гость
« : Декабрь 27, 2010, 19:44 »

Здравствуйте, коллеги. Возник следующий вопрос:

Предположим в одном потоке есть переменная типа unsigned int. Все операции с этой переменной происходят в этом же потоке. Следует также сказать, что ее значение меняется довольно часто. Другому потоку время от времени нужно узнать значение этой переменной, не изменяя ее при этом. Только считать.

Есть ли опасность того, что операция чтения вернет неверный результат, так как совпадет с изменением самой переменной в памяти?

P.S. Знаю о существовании QAtomicInt, но он мне не подходит, у меня - unsigned int.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 27, 2010, 19:55 »

Другому потоку время от времени нужно узнать значение этой переменной, не изменяя ее при этом. Только считать.
Ну и читайте, т.к. чтение 32-битного значения атомарно (без разницы signed/unsigned). Другое дело что опираться на считанное значение Вы не очень можете (др. нитка может изменить его в любой момент). Пример

Код
C++ (Qt)
if (theCount < 0) {   // здесь theCount < 0 (было дело)
 ...                         // аз здесь может быть >= (др. нитка изменила)
}
 
Записан
JamS007
Гость
« Ответ #2 : Декабрь 27, 2010, 20:09 »

Цитировать
Другое дело что опираться на считанное значение Вы не очень можете

В моем случае это не так важно.
Данная операция атомарна на любой платформе?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 27, 2010, 20:11 »

Цитировать
Другое дело что опираться на считанное значение Вы не очень можете

В моем случае это не так важно.
Данная операция атомарна на любой платформе?
Не хочу делать громких заявлений - но насколько я знаю - да (int по чтению)
Записан
Akon
Гость
« Ответ #4 : Декабрь 27, 2010, 20:22 »

Обязательно объяви эту переменную с модификатором volatile, иначе при оптимизации может получиться некорректный код. 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 22.