Являются ли операции C ++ int атомарными в архитектуре mips - PullRequest
4 голосов
/ 27 марта 2009

Интересно, смогу ли я прочитать или записать общее значение int без блокировки процессора mips (особенно Amazon или Danube). Я имею в виду, что такие операции чтения или записи являются атомарными (другой поток не может их прервать). Чтобы быть ясным - я не хочу предотвращать гонку между потоками, но меня волнует, не повреждено ли само значение int.

Предполагая, что компилятор выравнивает все целые по границам слова процессора, это должно быть возможно. Я использую gcc (g ++). Тесты также показывают, что, кажется, работает правильно. Но, может быть, кто-то знает это наверняка?

Ответы [ 4 ]

6 голосов
/ 27 марта 2009

Используйте встроенные атомарные операции gcc, и вы получите предупреждения, если они не поддерживаются: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html

Похоже, что на оборудовании возможны комбинации сложения / вычитания и тестирования (как минимум): http://rswiki.csie.org/lxr/http/source/include/asm-mips/atomic.h

5 голосов
/ 27 марта 2009

Зависит от операции. Посмотрев на достаточно разобранные программы в MIPS, я знаю, что только некоторые операции являются атомарными.

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

например:

x = 0; // move $a0, $0


x = 0x50000; // lui $a0, 0x0005


x = 0x50234; // lui $a0, 0x0005
             // ori $a0, 0x0234

MIPS сборка ссылка или здесь

см. здесь чтобы увидеть, что Дунай и Амазонка - это MIPS32, который покрывает мой пример, и поэтому не все 32-битные целые числа могут быть написаны атомарно.

см. R10000 в приведенном выше сообщении - MIPS64. Поскольку 32-битное значение будет вдвое меньше размера регистра, это может быть атомная загрузка / запись.

4 голосов
/ 27 марта 2009

Какие операции? Вероятно, что int a; a=42; является атомным. Нет гарантии, что a= a+42; является атомарным, или в любых вариантах, например, с ++. Кроме того, вы должны быть обеспокоены тем, что может сделать оптимизатор, например, удерживая промежуточное значение в регистре, когда это удобно.

3 голосов
/ 27 марта 2009

Вопрос предлагает вводящие в заблуждение ответы.

Вы можете только авторитетно отвечать на вопросы "это атомно" о ассемблере / машинном языке.

Любой данный фрагмент кода C / C ++ не дает никаких гарантий, может варьироваться в зависимости от того, какой именно компилятор (и версия) вы используете, и т. Д. (Если только вы не вызовете какой-либо встроенный в платформу встроенный или еще что-то, что гарантированно скомпилируется с известным атомарным машинная инструкция.)

...