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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Атомарные операции  (Прочитано 6411 раз)
blood_shadow
Гость
« : Апрель 20, 2011, 22:36 »

Доброй ночи всем,
как я понял атомарные операции - это операции которые выполняются без прерывания потока
но вот не совсем понятно чем собственно определяется вот эта атомарность,
временем выполнения(типа никак за это время поток не может быть переключен), или же особенностями
исполнения ассемблерных инструкций?

собственно не понятно почему
++a; - не атомарно
x = a; - атомарно
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Апрель 21, 2011, 01:12 »

Цитировать
собственно не понятно почему
++a; - не атомарно
x = a; - атомарно

Знакомый вопрос))
Как уже обсуждалось в соседней теме AtomicData...
Цитирую ответ brankovic
Цитировать
Цитировать
Цитата: m_ax от Март 25, 2011,  03:47
У меня ещё такой вопрос возник:
Является ли следующая операция атомарна? (m_flag - это char):
Код

C++ (Qt)
while (m_flag++);  // <<-- &#1040;&#1090;&#1086;&#1084;&#1072;&#1088;&#1085;&#1072; &#1083;&#1080; &#1086;&#1085;&#1086;?
critical_section();
m_flag = 0;


Из обычных операций атомарны только запись и чтение, и только того, что не больше size_t. Операция m_flag++ это по сути:

R = m_flag;
R = R + 1;
m_flag = R;

где R это регистр процессора. Между строкой 1 и 3 может вклиниться другой тред и всё испортить. Атомарные операции это специальные инструкции процессора (не портабильные), самая главная атомарная операция это atomic CAS, ещё можно почитать про load linked/store conditional.

Сейчас уже можно пользоваться шаблонным классом atomic в c++0x который обеспечивает атомарность, в частности, инкремента и декремента
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 21, 2011, 11:12 »

как я понял атомарные операции - это операции которые выполняются без прерывания потока
Нет, напр
Код
C++ (Qt)
atomic <int> test;
test = 0;
 
...               // здесь test было 0
++test;
                // а здесь может быть 1, но может и 2, 3 или др.
 
Вполне возможно что во время выполнения атомарного ++ др нитка также что-то сделала с test, просто атомарность гарантирует что "наша единичка" была добавлена корректно, т.е. изменения сделанные др. нитками не были утеряны. Конечно полагаем что др. нитки "ведут себя хорошо", не присваивают test значение а также пользуются atomic инкреметном/декрементом
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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