Ada_Ru форум

Обсуждение языка Ада

Re: [ada_ru] Re: Атомарные примитивы

Оставить новое сообщение

Сообщения

kazakov1961
Re: [ada_ru] Re: Атомарные примитивы
2009-10-06 11:19:07

On Fri, 6 Nov 2009 08:27:17 +0000 (UTC), you wrote:

 

На pragma Atomic для new Unsigned_n GNAT, кстати, ругается в

любом случае, потому что примитивные операции уже объявлены.

 

Не понял. У меня не ругается.

 

Я развлекался задачкой реализации X := X + 1 используя

только pragma Atomic.

 

Одна из причин, почему это не получится — нужен барьер памяти.

Без lock, mfence или т. п. не будет гарантирован порядок.

 

В том то и соль, используя атомарное чтение и запись, сделать это без блокировки. Например, пишется значение плюс уникальный водяной знак. Задача читает записанное собой и определяет, не вклинился ли кто, если да, то делает некий откат и повторяет. Идея lock-free в частности - замена пассивного ожидания на polling с откатами.

 

Есть некая религиозная составляющая lock-free, не использовать

синхронизацию вообще. Но это - мура, ясно, что не нужную синхронизацию надо убирать, но любое разделение stateful данных по-определению эквивалентно синхронизации. Так что в конечном итоге кто-то где-то должен ждать. Вопрос кто, где и как.

 

А нет ли такого места, где переупорядочивание

записи/чтения могло бы всё испортить?

 

Если порядок влияет, то программа не корректна - race condition.

 

А присваивания

по адресам, выравненным на границе 4х байт, я так понимаю, за

счёт архитектуры атомарны, даже без всяких блокировок.

 

Это и есть неявная блокировка. "Архитектура" синхронизует то, что логически асинхронно. Это не везде так. Например, в VAX некоторые инструкции, например копирование строки, были очень даже прерываемы.

 

Я имел в виду что–нибудь такое же короткое, как X := X + 1;

 

Как Вы определите "короткое"?

 

X := следующее за X простое число;

 

это "коротко" или "длинно"?

 

Наверное, какой–нибудь Intel Ada Compiler мог бы соптимизировать этот крендель в 32битное целое. Нету атомарности в стандарте,

понял уже.

 

Атомарность есть, но не на произвольные выражения, т.к. см. пример выше, смысла это не имеет.

 

Вадим что–то писал насчёт разницы в три раза для Qt строк в

C++ и в Аде. Не привлекательно.

 

Я не уверен, что строки должны быть разделяемыми. В аналогичной ситуации, вместо скажем так "реляционной таблицы" с конкурентным доступам к ячейкам, я решил что тупая реплика будет проще. Да, надо сначала скопировать, а потом писать "взад", но так оно проще. Память нынче дешева, а на

гигабайтных файлах оно так и так ляжет.

 

Интересно, если соптимизировать так:

 

type Fast_Reference_Counter is record

Common_Counter : Integer_32 := 0;

pragma Atomic (Common_Counter);

Origin_Thread_Id : Unsigned_32 := Current_Thread_Id;

Origin_Counter : Integer_32 := 0;

end record;

 

Зачем свой счетчик хранить? Для lock-free двойного буфера мало будет. Скорее четырехкратный надо, по-минимуму, если вообще...

... это будет быстрее, чем обычный счётчик ссылок?

 

а где алгоритм-то?

 

Я сейчас

программированием занимаюсь в Windows XP, запущенной в VMWare

на Mac OS X. Для программирования нормально, но для

замеров не подходит.

 

Не знаю. Эмуляция тут ни причем, но доступ к нормальным часам нужен. Если разрешение часов скажем 1 секунда (BIOS), то мерить надо 2 минуты, для 1% ошибки измерения. Не проблема, в общем...

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти