Critical section: Синхронизация процессов (не потоков)

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 14 ноя 2008.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет!

    Можно ли использовать Critical section при синхрониззации потоков из РАЗНЫХ ПРОЦЕССОВ ?

    Функции EnterCriticalSection и LeaveCriticalSection в качестве параметров требуют
    указатель на структуру CRITICAL_SECTION. А использование указателя (не хэндла)
    подразумевает их использование в одном адресном пространстве (и значит процессе)

    А если я создам файл-маппинг (CreateFileMapping + MapViewOfFile)
    и помещу туда структуру CRITICAL_SECTION ? Ведь тогда она станет доступной
    всем процессам и тогда можно будет синхронизировать потоки из разных процессов.

    Я прав ? Нет ли здесь граблей под подводными камнями ?

    Заранее спасибо.


    ЗЫ или таки проще использовать мутехи и не заморачиваццо с файл-маппингом ?
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в мсдн все написано
     
  3. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Тоже приходила такая идея. Похоже, что в МСДН такую возможность просто не учли - ведь действительно, это не объект ядра, и в каждом процессе достаточно будет иметь промаппированную область с критической секцией.
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Не пойдёт. Критические секции используют хэндл обьекта, семафора вроде. А он локален в процессе.
     
  5. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Критическая секция сама по себе - не объект ядра, но она использует объект ядра (семафор), если в EnterCriticalSection приходится ждать. Так что между разными процессами это не пройдёт (хэндл семафора, созданный в одном процессе, невалиден для другого), даже если структура лежит в разделяемой памяти.
    Added: опоздал немного
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Я тоже хотел сделать такое в шаред мемори :) Красиво же

    Эта секция сработает только в том случае если хендл ее мутекса совпадет по значению в разных процессах
    Сделать это можно так: инициализировать сеуцию в одном процессе, потом во втором прочитать величину хендла и с помощью создания пустышек добиться ее же в DuplicateHandle
    Теоретически это должно работать, практического смысла в этом я не увидел и пробовать не стал
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    А если второй процесс создаётся из первого, то можно перед его созданием сделать хэндл семафора наследуемым...
     
  8. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Согласен.
    Тем более такого же результата синхронизации можно достичь через мутехи.