Трохи збірки

Після прочитання цієї статті про блокування вільних буферів і, побачивши використання 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;
 }