Немного сборки

После прочтения этой статьи о блокировки свободных буферов и, увидев использования CAS (сравнить и своп), я чувствовал, что размещение сборки кода, чтобы сделать то же самое. Используйте случае там было написать собственный метод и вызывать его из Java (еще в 1.5, когда одновременно структур данных в Java были более или менее несуществующие). Не мудрствуя лукаво, я раскрыть код на вас :) . Во-первых, для СПС и второй для вычисления НОД по алгоритму Евклида (это могут быть найдены во многих местах и ​​учебных пособий, а).

Скомпилируйте и запустите инструкцию gcc file_name.c ; ./a.out

Сравните и Обмен

   # Include 
  # Include 
 / / Обмен - NewValue, comperand старое / ожидаемое значение
 / *
  * Функция фактически выполняет следующие вещи - если значение в * DEST равно OldValue затем заменить его NewValue еще оставить его без изменений: не все эти атомарно
  *
  * Есть два варианта возврата
  * 1.is начальное значение * DEST и оставить бремя вызова FXN сравнить его с oldval
  * 2.  сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным
  ** /

 / * Позже изменить его в макросов * /
 Int CAS (Int * НАЗНАЧЕНИЕ, OldValue Int, Int NewValue) {
	 Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue);
	 / * Int CAS (INT DEST, Int OldValue, Int NewValue) {* /
	 / * Int CAS (INT DEST, Int NewValue, Int OldValue) {* /
	 Int результат = 1 ;/ * 1 показывает, что CAS успешно и 0 показывает, что он не * /
	 / * Кстати нужно установить флаг см для затирания!  * /
	 volatile__ __asm__ __ (
			 "Movl% 2,%% EAX \ п \ т"
			 "Movl% 3,%% EBX \ п \ т"
			 "Movl 0%,%% ECX \ п \ т"
			 "LOCK \ п \ т"
			 "CMPXCHG%% EBX, (%% ECX) \ п \ т" / * должны быть блокировки на одной строке * /
			 "Совершено JZ \ п \ т"
			 "Movl $ 0,% 1 \ п \ т"
			 "Совершено: \ п \ т"
			 : "= М" (Dest), "= г" (результат)
			 "Г" (OldValue), "г" (NewValue), «м» (Dest)
			 : "% EAX", "% EBX", "ECX", "CC"
			 );
	 Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue);
	 возвращение результата;
 }

 / * TODO
  * Написать еще АНМ FXN которая ставит выше FXN в то время цикла и продолжать пробовать, если он успешно * /

 Int основных () {
	 Int = 5, б = 6;
	 Int * с = (INT *) таНос (SizeOf (INT));
	 * С = 6;
	 / * Int C = 6, * /
	 Е ("% г \ п", CAS (C, B, б));
	 Е ("% г \ п", CAS (C, B));
	 Е ("% г \ п", CAS (С, А,));
	 Е ("% г \ п", CAS (C, B, б));
	 * С = 6;
	 / * С = 5, * /
	 Е ("изменение значения с * к% г \ п", * с);
	 Е ("% г \ п", CAS (C, B, б));
	 Е ("% г \ п", CAS (C, B));
	 Е ("% г \ п", CAS (С, А,));
	 Е ("% г \ п", CAS (с, а, б));
	 Е ("% г \ п", CAS (C, B));
	 return 0;
 }

Форматирование ноты - кажется WP подсветку синтаксиса добавления В конце концов, игнорировать это.

НОД

 # Include 
 Int НОД (INT A, INT B) {
     Int результат;
     / * Вычислить Наибольший общий делитель по алгоритму Евклида * /
     __asm__ __ volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2,%% EBX;"
                           "ПРОДОЛЖЕНИЕ: cmpl $ 0,%% EBX;"
                           "Совершено е";
                           "Xorl%% EDX, EDX%%";
                           "Idivl%% EBX;"
                           "Movl EBX%%%% EAX;"
                           "Movl%% EDX, EBX%%";
                           "JMP ПРОДОЛЖЕНИЕ";
                           "Совершено: movl%% EAX,% 0,": "= г" (результат): "г" (а), "г" (б)
     );

     возвращение результата;
 }

 Int основных () {
     int, первое, второе;
     Е ("Введите два целых числа:");
     Scanf ("% D% D", и первое, и второе);

     Е ("НОД% D и% D% г \ п", первый, второй, НОД (первый, второй));

     return 0;
 }