Russian Qt Forum

Программирование => С/C++ => Тема начата: blood_shadow от Апрель 20, 2011, 22:36



Название: Атомарные операции
Отправлено: blood_shadow от Апрель 20, 2011, 22:36
Доброй ночи всем,
как я понял атомарные операции - это операции которые выполняются без прерывания потока
но вот не совсем понятно чем собственно определяется вот эта атомарность,
временем выполнения(типа никак за это время поток не может быть переключен), или же особенностями
исполнения ассемблерных инструкций?

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


Название: Re: Атомарные операции
Отправлено: m_ax от Апрель 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 который обеспечивает атомарность, в частности, инкремента и декремента


Название: Re: Атомарные операции
Отправлено: Igors от Апрель 21, 2011, 11:12
как я понял атомарные операции - это операции которые выполняются без прерывания потока
Нет, напр
Код
C++ (Qt)
atomic <int> test;
test = 0;
 
...               // здесь test было 0
++test;
                // а здесь может быть 1, но может и 2, 3 или др.
 
Вполне возможно что во время выполнения атомарного ++ др нитка также что-то сделала с test, просто атомарность гарантирует что "наша единичка" была добавлена корректно, т.е. изменения сделанные др. нитками не были утеряны. Конечно полагаем что др. нитки "ведут себя хорошо", не присваивают test значение а также пользуются atomic инкреметном/декрементом