Здравствуйте, -rsdn-, Вы писали:
R>особенно не понятно "юзер левел, кернел левел"
Есть примитивы синхронизации которые работают в user mode, напр. Monitor.Enter(Object obj) внутри одного appdomain.
Т.е. .net внутри памяти выделенной для процесса в куче для каждого appdomain создает список хешей всех объектов которые лочатся во время выполне кода в контексте какого-либо треда, так другие треды понимают что если хеш объекта есть в списке значит он залочен.
Есть примитивы которые создают объект ядра ОС для синхронизации между процессами, напр. Mutex.
Создать кастомный объект синхронизации значит сделать похожий на уже существующие, но с какими-то кастомными фичами.
Если надо делать синхронизацию ресурсов на уровне ОС(между процессами, домменами), то можно наследоватся от базового класса MarshalByRefObject или более расширенного класса — его потомка: WaitHandle или вообще просто сделать врапер над уже сущесвующими примитивами синхронизации.
Рекомендуемая литература:
Рихтер .net, c\c++.
Windows Internals.
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, -rsdn-, Вы писали:
R>Как сделать кастомный объект сихронизации R>особенно не понятно "юзер левел, кернел левел"
Элементарно:
1. изучаем существующие, подгоняем наш код под них.
2. находим готовую реализацию, утягиваем.
3. объясняем заказчику, что вообще-то нынче модно lock free (отсылка к no sql expert)
4. выносим код в облако, рассказываем заказчику про теорему Брюера. Опровергнет — получите нобелевку Тьюринга на халяву.
5. Спрашиваем на форуме "я изменяю текст на кнопке в фоновом потоке и всё падает, что не так с фреймворком?". Собираем ответы.
5a. Для троллей: дублируем вопрос на LOR и транслируем ответы между обоими ветками.
6. Пишем class MuSuperLock: ReaderWriterLockSlim { }. Глядя в круглые подергивающиеся глаза заказчика рассказываем про code reuse, DRY и нехватку миксинов в шарпе.
7. Коммерческий: приглашаем на интервью Рихтера, просим набросать свой lock. Продаём как "Одобрено Рихтером"
7a. ... от Sinclair-а: между делом доказываем Рихтеру, что он неправ
.
7b. ... от Баллмера: покупаем Руссиновича и какую-нибудь компанию в нагрузку. Oh, wait...
8. Про стандартный "изучаем проблему, решаем, пишем код" даже писать не буду — слишком скучно.
Здравствуйте, -rsdn-, Вы писали:
R>особенно не понятно "юзер левел, кернел левел"
В юзерлевел есть такие вещи, как Monitor
У него кучка интересных методов, в частности Pulse и PulseAll.
На ём реализуется lock, а есть более высокоуровневые срдества, например — блокирующая очередь.
Если у тебя уже есть такая очередь — можно на ней реализовать и мутекс и семафор.
В кернел левел любой блокирующий вызов через сеть, пайпы, файловую систему и тд, можно использовать для синхронизации. Хучь даже сам тред или процесс, не говоря про stdio и stdout.