yigal_s: (Default)
[personal profile] yigal_s
1. Semaphores
2. Monitors (conditional variables).
3. Messages, рандеву, remote calls, actors (пока не разобрался, одно ли это и то же концептуально, или есть разница. Вообще, в принципе, больше "слышал звон", чем "в теме". Потихоньку разберусь)
4. transactional memory - несколько дней назад где-то ссылку на это дело подобрал.

Интересно, есть еще что-то неупомянутое?

-----
Upd: собственно, в списке представлена некоторая линия эволюции (хотя линейной эволюции в реальности, видимо, не было в точности) способов "синхронизации", вернее, написания мультитредного кода.

то ли еще будет...

Date: 2007-01-24 05:07 pm (UTC)
From: [identity profile] yms.livejournal.com
deadlock
для гуи в .NET - Invoke()
для COM - apartments
ну и всякие стандартные приемчики типа как организовать синглтон в условиях мультитрединга

Date: 2007-01-24 05:18 pm (UTC)
From: [identity profile] cmm.livejournal.com
> Интересно, есть еще что-то неупомянутое?

единственный по-настоящему надёжный вариант — не приставать к дракону вообще.

на крайняк использовать shared memory между процессами, для чётко определённых вещей.

короче: отказаться от модели, в которой shared memory является выбором по умолчанию.

Date: 2007-01-24 05:34 pm (UTC)
From: [identity profile] cmm.livejournal.com
> несколькими компьютерами к общей базе данных - проблемы, в общем, по большому счету те же.

это очень большой счёт, однако.  реляционная база данных — куда более ограниченная формальная модель, нежели оперативная память фон-неймановского компьютера.

Date: 2007-01-24 05:51 pm (UTC)
From: [identity profile] cmm.livejournal.com
я утверждаю примерно следующее, на самом деле: все возможные модели безопасного и постижимого для человеческого ума параллельного доступа к памяти так или иначе сводятся к двум вещам:

* объявлению параллельного доступа к константным данным простой оптимизацией (то есть с точки зрения семантики клиентского кода, абсолютно параллельно где эти данные сидят: все в одном месте или в виде кучи копий).

* созданию у изменяющего данные кода иллюзии параллельного доступа и чёткой синхронизации (то бишь убиранию параллельности) этого дела "под капотом".

Date: 2007-01-24 07:02 pm (UTC)
From: [identity profile] cmm.livejournal.com
ну собственно transactional memory с аппаратной поддержкой — это именно вот оно.
гениальная фишка, на самом деле.

Date: 2007-01-24 09:02 pm (UTC)
From: [identity profile] cmm.livejournal.com
> проблемы написания блокирующего (а не транзакционного) мультитрединга было бы правильно загнать в какую-то математическую теорию.

загнать-то можно (типа CPU + память = такая большая машина состояний, далее везде), толку только с таких теорий.  практикующие теоретики (хихи) предпочитают атаковать проблему формализации со стороны упрощения моделей, а не совершенствования теорий — видимо, у них есть на это хорошие причины. :)

> Вы, кстати, не знакомы вот с этой работой?

ой, нет.  я на самом деле в математике очень слаб...

Date: 2007-01-24 05:38 pm (UTC)
From: [identity profile] cmm.livejournal.com
существование чёткой каузальной зависимости между привычкой наступать на грабли и черепно-мозговым травматизмом тоже не доказано.  в силу хотя бы неоднозначного направления каузации.

и тем не менее. :)

Date: 2007-01-24 05:44 pm (UTC)
From: [identity profile] cmm.livejournal.com
в том-то и дело: для реляционных баз данных проблема решена: давно, строго и формально (если я ничего не путаю, да).

Date: 2007-01-24 05:53 pm (UTC)
From: [identity profile] cmm.livejournal.com
написание функции для вычисления факториала требует программирования, при котором в принципе неизбежны баги.  но чёткое знание того что мы делаем очень помогает.

Date: 2007-01-24 09:06 pm (UTC)
From: [identity profile] cmm.livejournal.com
вообще всё дело в правильных абстракциях.
вот взять то же ядро юникса: это же очень сложная и чудовищно граблесодержащая вещь — включая и грабли параллельного доступа к общим ресурсам, причём не только к памяти!  но экономика предоставляет нам возможность взять готовую реализацию и рассматривать её как чёрный ящик.

Date: 2007-08-08 07:38 pm (UTC)
From: [identity profile] dumalkin.livejournal.com
Transactional memory не решает проблемы паралельной работы.
Это хорошая штука, но сама по себе к параллельности отношения не имеет, и зачастую полезна в однопотоковом приложении.
Хотите многопоковость без дедлоков ?:) Это есть у нас - наш апп. сервер как раз это и дает.
В кратце идея - автоматическое превращение вызовов в асинхронные, и автоматическое перенаправление чтений данных с неизменяемых автоматически создаваемых копий. В С++ (первая версия) это было дубль- буферизация, сейчас в .Нет - мусорщик собирает неиспользуемые копии :)
Кстати, транзакции на уровне обьектов (не строчек в ДБ) у нас тоже есть :)