Синхронизация вызовов
От: Cruser Украина  
Дата: 03.07.07 16:25
Оценка:
Если есть набор классов, вызовы методов которых должны быть внутренне синхронизированы, то как обычно делают это в сложных проектах:

1) Просто в каждый метод добавить семафор
2) Организовать очередь сообщений (вызовов).

Первый вариант вроде проще, но при добавлении нового метода можно забыть про семафор.
Второй вариант элегантнее, но имеет минусы: надо как-то организовывать возврат результатов, на каждую функцию заводить структуру для её параметров, а также код сообщения.

3) ?
Re: Синхронизация вызовов
От:  
Дата: 03.07.07 16:53
Оценка: +1
Hello, Cruser!
You wrote on Tue, 03 Jul 2007 16:25:38 GMT:

C> Если есть набор классов, вызовы методов которых должны быть

C> внутренне синхронизированы, то как обычно делают это в сложных
C> проектах:

C> 1) Просто в каждый метод добавить семафор

C> 2) Организовать очередь сообщений (вызовов).

C> Первый вариант вроде проще, но при добавлении нового метода можно

C> забыть про семафор.

Методы должны быть синхронизированы на что — на свой объект?

Если язык не поддерживает более выскоуровневую модель, то да: семафоры/мониторы и ручная синхронизация. Но, например, в Java механизм мониторов встроен непосредственно в язык: ты указываешь, что метод синхронизированный, и безопасный конкурентный доступ обеспечивается автоматически.

Если очень заботит проблема забыть войти или выйти из монитора, то для контроля можно использовать прокси-объекты или AOP.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Синхронизация вызовов
От: Cruser Украина  
Дата: 04.07.07 05:30
Оценка:
YК>Если очень заботит проблема забыть войти или выйти из монитора, то для контроля можно использовать прокси-объекты или AOP.

Язык С++. Да, прокси вроде удобнее.
Re[2]: Синхронизация вызовов
От: Didro Россия home~pages
Дата: 04.07.07 06:42
Оценка:
Здравствуйте, YК, Вы писали:

YК>Если язык не поддерживает более выскоуровневую модель, то да: семафоры/мониторы и ручная синхронизация. Но, например, в Java механизм мониторов встроен непосредственно в язык: ты указываешь, что метод синхронизированный, и безопасный конкурентный доступ обеспечивается автоматически.


Хотел бы добавить, что он безопасный только с точки зрения взаимоисключающего доступа, он гонок и дедлоков такой подход (навешивание атрибута syncronized) разумеется не спасет.
Re[3]: Синхронизация вызовов
От: Cruser Украина  
Дата: 04.07.07 07:32
Оценка:
Здравствуйте, Cruser, Вы писали:

YК>>Если очень заботит проблема забыть войти или выйти из монитора, то для контроля можно использовать прокси-объекты или AOP.


C> Язык С++. Да, прокси вроде удобнее.


Вернее не прокси, а временный объект. Типа:

Locker().GetMyObject()->MyFunc();
Re: Синхронизация вызовов
От: remark Россия http://www.1024cores.net/
Дата: 08.07.07 21:06
Оценка:
Здравствуйте, Cruser, Вы писали:


C> Если есть набор классов, вызовы методов которых должны быть внутренне синхронизированы, то как обычно делают это в сложных проектах:


C>1) Просто в каждый метод добавить семафор

C>2) Организовать очередь сообщений (вызовов).

C> Первый вариант вроде проще, но при добавлении нового метода можно забыть про семафор.

C> Второй вариант элегантнее, но имеет минусы: надо как-то организовывать возврат результатов, на каждую функцию заводить структуру для её параметров, а также код сообщения.

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

C>3) ?


3) Элиминировать разделение данных

4) Реализовать lock-free reader pattern или full-fledged lock-free

з.ы. в первом пункте использовать надо, естественно, не семафоры, а user-space mutex подходящего типа.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Синхронизация вызовов
От:  
Дата: 18.08.07 12:10
Оценка:
Здравствуйте, Didro, Вы писали:

D>Здравствуйте, YК, Вы писали:


YК>>Если язык не поддерживает более выскоуровневую модель, то да: семафоры/мониторы и ручная синхронизация. Но, например, в Java механизм мониторов встроен непосредственно в язык: ты указываешь, что метод синхронизированный, и безопасный конкурентный доступ обеспечивается автоматически.


D>Хотел бы добавить, что он безопасный только с точки зрения взаимоисключающего доступа, он гонок и дедлоков такой подход (навешивание атрибута syncronized) разумеется не спасет.


Насчет гонок — мимо кассы. Java Language Specification гарантирует отсутсвие гонок при использовании synchronized.

17.4.5. Happens-before Order

Two actions can be ordered by a happens-before relationship. If one action happens-before another, then the first is visible to and ordered before the second.

If we have two actions x and y, we write hb(x, y) to indicate that x happens-before y.


We say that a read r of a variable v is allowed to observe a write w to v if, in the happens-before partial order of the execution trace:


Informally, a read r is allowed to see the result of a write w if there is no happens-before ordering to prevent that read.

Re: Синхронизация вызовов
От: Maxim S. Shatskih Россия  
Дата: 18.08.07 12:44
Оценка:
C>1) Просто в каждый метод добавить семафор
C>2) Организовать очередь сообщений (вызовов).

Каков внешний интерфейс к этой подсистеме?

Если там устроят только блокирующие вызовы — т.е. нить позвала этот вызов и там в нем заблокировалась, возможно, надолго — то 1 будет достаточно вполне. Очередь там все равно будет — очередь ожидающих нитей в кернеле

2, на мой взгляд, имеет смысл, только если речь идет об overlapped, asynchronous интерфейсу к этой подсистеме. То есть — вызов дает задание, не блокируясь, задание начинает как-то выполняться, и вызывающей стороне доступна на него ссылка. Через ссылку можно "узнать, как дела" — т.е. дождаться завершения и узнать результат выполнения завершенного задания.

Если такие навороты — как в NTшной подсистеме ввода-вывода — хочется иметь, то вот тогда надо делать 2. Иначе я не вижу никакого толку в 2, а усложнение там весьма заметно, нужен, например, еще класс объектов "задание", механизмы ожидания их завершений и прочее такое.
Занимайтесь LoveCraftом, а не WarCraftом!
Re: Синхронизация вызовов
От: DENIVA Россия http://www.uml3.ru
Дата: 20.08.07 16:33
Оценка:
Здравствуйте, Cruser, Вы писали:

C>1) Просто в каждый метод добавить семафор


C> Первый вариант вроде проще, но при добавлении нового метода можно забыть про семафор.


Попробуйте aspect-oriented составляющую, чтобы облегчить себе жизнь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.