LINUX.ORG.RU

Атомарная ассемблерная вставка в gcc

 , , ,


2

6

Хочу реализовать самый примитивный мьютекс.

Написал такой код: http://pastebin.com/bqX9xKtQ
Компилять так: `gcc -pthread ./lock.c -o lock.elf -lpthread && ./lock.elf`

Прочитал статью в википедии: Тыц

XCHG — Операция обмена между памятью и регистром. Выполняется атомарно на x86-процессорах
Ассемблерная вставка соответствующей атомарной инструкции.

Я так понимаю что мой mutex_lock не является атомарным, а вместо него надо бы заюзать что-то вроде

__asm
{
    mov eax, 1
    xchg eax, mx
}

Так вот, как В ЭТОМ ВАШЕМ GCC С ЕГО ИНОПЛАНЕТНЫМ СИНТАКСИСОМ НАПИСАТЬ ТО ЖЕ САМОЕ?

Для тех кто не в курсе синтаксиса gcc:

asm volatile ( "rdtsc\n\t"   
               "shl $32, %%rdx\n\t"  
               "or %%rdx, %0"        
               : "=a" (msr)
               :
               : "rdx");

★★

тебя в гугле забанили? первая же ссылка на стэковерфлоу дает то, что тебе нужно.

До кучи — mov...; xchg ... — две инструкции. О какой атомарности ваще речь?

demidrol ★★★★★ ()
Ответ на: комментарий от anonymous

Это все хорошо, они как бы атомарная операция, вот только спроектированы они ущербно, причем так, что они не выполняют свою функцию:

__atomic_test_and_set(&b, ...)
        ^              ^
      atomic         atomic

Вот только атомарная + атомарная не равно атомарная. Подробный разбор здесь: http://stackoverflow.com/a/6786313/2932207

PPP328 ★★ ()
Ответ на: комментарий от PPP328

Вот только атомарная + атомарная не равно атомарная.

Для твоих целей там будет достаточно атомарности. Тебе нужно в mutex_lock() проверить, что mutex еще не равен 1 и записать туда 1 (константу, а не содержимое другой переменной). В mutex_unlock() нужно просто записать 0 (атомарно). Для этих целей встроенные функции подходят намного лучше твоих самописных велосипедов. Причина такова: для атомарных операций тебе нужно их не только сделать атомарно (в смысле неделимо), но и так, чтобы ни компилятор, ни процессор в целях оптимизации не переставили какие-либо присваивания до или после твоих атомарных операций (т.е. если присваивание было до блокировки mutex, оно и будет проделано до блокировки). И встроенные атомарные функции предотвращают такие переупорядочивания присваиваний значений. Своим велосипедом ты такого если и добьешься, то потеряешь в производительности (да и по ходу поймешь, что проще использовать builtin'ы).

Короче - не изобретай велосипед, используй builtin'ы, предназначенные для этих целей (если тебе нужно просто использовать это, а не досконально разобраться в происходящем на самом низком уровне, хотя даже в этом случае в результате придется использовать встроенные возможности, потому что атомарные переменные нельзя сделать только средствами библиотеки, тут требуется поддержка компилятора или будет лишняя потеря производительности).

Вот тут https://events.yandex.ru/lib/talks/3550/ можно послушать, чтобы лучше понять о чем я говорю (там про C++, но на низком уровне происходящее одинаково, что для C, что для плюсов).

anonymous ()
Ответ на: комментарий от PPP328

Т.е. твоя вставка с XCHG позволяет атомарно передать из памяти в память, я верно понял твой посыл?

anonymous ()

ИНОПЛАНЕТНЫМ СИНТАКСИСОМ

Дуй на винфак, нормальный AT&T-шный синтаксис.

anonymous ()
Ответ на: комментарий от kirk_johnson

А можно перехитрить ядро и сделать кооперативную многозадачность, как на православной Mac OS Classic, чтобы хрен оно регистры у проги отобрало, пока сама не отдаст? Способы, требующие доступа в Ring 0, сойдут тоже.

anonymous ()

Какой нафек му​​​​такс?

На чесы посматри! Какой там год? Используй TSX инструкцыи!!!

anonymous ()
Ответ на: комментарий от PPP328

вот только спроектированы они ущербно, причем так, что они не выполняют свою функцию:

Это не правда. Функцию свою они более чем выполняют и спроектированы ровно так, чтобы работать на большинстве платформ без блокировок.

Не читайте до обеда stackoverflow.

vzzo ★★★ ()
Ответ на: комментарий от anonymous

чтобы хрен оно регистры у проги отобрало

anonymous (11.02.2017 2:03:39)

ты, видимо, был нетрезв, бро

anonymous ()
Ответ на: комментарий от kirk_johnson

тогда ему нужен freedos. но причём здесь регистры?

anonymous ()
Ответ на: Какой нафек му​​​​такс? от anonymous

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

stevejobs ★★★☆☆ ()
Ответ на: комментарий от annulen

Кстати, а вот все эти упомянутые билтины, уважают RSX/TSX? Как с помощью них сказать XBEGIN?

stevejobs ★★★☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.