Реализация компонента с ThreadingModel = Both
От: CrazyBaboon Россия  
Дата: 28.01.09 13:10
Оценка:
Здравствуйте!

Необходимо для существующего компонента поменять потоковую модель с Apartment на Both.
Правильно ли я понимаю, что в этом случае код компонента надо сделать потокобезопасным? Достаточно
ли в каждом методе добавить блокировку критической секции или мьютекса? (через "умный" объект, чтобы свести к минимуму дублирование)

Заранее спасибо!
Re: Реализация компонента с ThreadingModel = Both
От: Аноним  
Дата: 28.01.09 16:27
Оценка:
Здравствуйте, CrazyBaboon, Вы писали:

CB>Здравствуйте!


CB>Необходимо для существующего компонента поменять потоковую модель с Apartment на Both.

CB>Правильно ли я понимаю, что в этом случае код компонента надо сделать потокобезопасным? Достаточно
CB>ли в каждом методе добавить блокировку критической секции или мьютекса? (через "умный" объект, чтобы свести к минимуму дублирование)

А смысл тогда в Both, если делать в каждом методе блокировку?
Re[2]: Реализация компонента с ThreadingModel = Both
От: rus blood Россия  
Дата: 28.01.09 21:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А смысл тогда в Both, если делать в каждом методе блокировку?


Не нужен маршаллинг, не нужна очередь сообщений, объект может жить дольше, чем поток, который его создал...
Имею скафандр — готов путешествовать!
Re: Реализация компонента с ThreadingModel = Both
От: rus blood Россия  
Дата: 28.01.09 21:28
Оценка:
Здравствуйте, CrazyBaboon, Вы писали:

CB>Здравствуйте!


CB>Необходимо для существующего компонента поменять потоковую модель с Apartment на Both.

CB>Правильно ли я понимаю, что в этом случае код компонента надо сделать потокобезопасным? Достаточно
CB>ли в каждом методе добавить блокировку критической секции или мьютекса? (через "умный" объект, чтобы свести к минимуму дублирование)

Если объкт сам не использует другие объекты, которые требуют single-threaded apartment...

Можно синхронизировать только доступ к внутренним данным объекта. Можно легко напороться на deadlock.

Можно обойтись без блокировок, если клиент гарантирует, что в каждый момент времени с объектом работает только один поток (т.н. rental модель).
Имею скафандр — готов путешествовать!
Re[2]: Реализация компонента с ThreadingModel = Both
От: CrazyBaboon Россия  
Дата: 29.01.09 13:19
Оценка:
Здравствуйте!

Здравствуйте, rus blood, Вы писали:

RB>Если объкт сам не использует другие объекты, которые требуют single-threaded apartment...

RB>Можно синхронизировать только доступ к внутренним данным объекта. Можно легко напороться на deadlock.
RB>Можно обойтись без блокировок, если клиент гарантирует, что в каждый момент времени с объектом работает только один поток (т.н. rental модель).

Нет, никаких гарантий никто не дает. Меня интересует именно техника организации потокобезопасности компонента вручную, есть ли какие-то подводные камни на пути с критическими секциями?
Re[2]: Реализация компонента с ThreadingModel = Both
От: CrazyBaboon Россия  
Дата: 29.01.09 13:25
Оценка:
Здравствуйте!

Здравствуйте, Аноним, Вы писали:

А>А смысл тогда в Both, если делать в каждом методе блокировку?


Конкретно в моем случае невозможна работа с компонентом из C# Console Application с MTA под x64 — проблемы с маршаллингом. Менять публичный интерфейс, для разрешения проблем с маршаллингом, я не могу. Замена потоковой модели на Both решает проблему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.