Паралельные вычисления

Тема в разделе "WASM.ASSEMBLER", создана пользователем Boola, 13 апр 2005.

  1. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    Ситуация такая: Есть динамичесая библиотека несколько функций которой работают с одной и той же облатью памяти.

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



    mov eax, Flag_syn

    wait:

    cmp [eax], 0 ;{1}

    jnz wait ;{2}

    mov [eax], 1 ;{3}

    ............

    mov [eax], 0

    ret



    Работает невсегда. Очевидно несколько функций могут одновременно выполнить строки 1-3, либо одна функция не успевает установить флаг (строка 3), а вторая в это время проверяет его значение.

    Как все это делается правильно?, либо где есть доки.

    Будут ли отличия для Win9x и Win NT
     
  2. Sten

    Sten New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2003
    Сообщения:
    39
    Тебе нужно юзать примитивы синхронизации, которые предоставляет операционная система. Прежде чем выполнять какие-либо операции над твоей областью памяти, ты должен захватить объект синхронизации (возможно критическую секцию). Смотри функции EnterCriticalSection()/LeaveCriticalSection().



    Если же область памяти небольшая - размером с ULONG, (например твой флаг), то можно для его модификации и проверки юзать InterlockedXXX() функции.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Я думаю тебе надо юзать именно то что предоставляет система! Этому мнению способоствует прочитанное в Э.Танненбауме "Современные операционные системы", после этого у тебя появится полное понимание что может произойти, если ты поступишь по другому.



    Ищи в ней про процессы, к примеру страницы около "спящего брадобея"
     
  4. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    A_Must_Loll

    А че у тебя функции в разных потоках? Или ты либу по нескольку раз грузиш?



    Да функции вызываютя из разных потоков.





    Не нашел какой функцией проверить состояния флага не меняя его.



    Еще вопрос по InterlockedExchange - такая фраза The function prevents more than one thread from using the same variable simultaneously. Поглядел в kernel там ниже следующие:



    mov ecx, dword ptr [esp+4]

    mov eax, dword ptr [esp+8]

    xchg dword ptr [ecx], eax

    ret 8



    Понятно, что функция работает но как она синхронизирует потоки (система Win98 2-e изд.).
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 Boola

    Синхронизация была очень хорошо в Рихтере описана.
     
  6. Sten

    Sten New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2003
    Сообщения:
    39
    Boola, у тебя видимо однопроцессорный HAL, поэтому никакой синхнонизации в InterlockedExchange() нет. В многопроцессорном варианте используется префикс LOCK.
     
  7. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Boola

    Не парься с флагом, синхронизацию так никто не делает.

    Используй критическую секцию.
    Код (Text):
    1.  
    2. .data
    3.     CRITICAL_SECTION CritSection
    4.     ...
    5.  
    6. .code
    7.     ...
    8.     push offset CritSection
    9.     call EnterCriticalSection
    10.  
    11. work_with_shared_memory:
    12.     ...
    13. end_work_with_memory:
    14.     push offset CritSection
    15.     call LeaveCriticalSection
    16.  




    Только не забудь, что перед первым использованием нужно вызвать InitializeCriticalSection.

    И, как сказал NoName, почитай Рихтера - многие вопросы отпадут.
     
  8. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    Всем спасибо, пошел книжки читать.



    P.S. Если не влом дайте описание структуры CRITICAL_SECTION
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Описание CRITICAL_SECTION, как и всего прочего смотрится здесь: http://msdn.microsoft.com/

    Прототип также должен быть в windows.inc.
     
  10. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    с крит. секцией красиво, но проще с interlocked фнукциями.

    это был мой opinion.

    А касательно win98, там ядро однопоточное если не ошибаюсь. Т.е. вызовы из разных приложений обрабатываются последовательно а не параллельно. Когда я последний раз его (98) дебажил. я заметил, что почти каждая функция юзерспейса (ведущая в ядро) начинается с вызова FlushInstructionsCache. Как я подозреваю - это сводится к сбросу конвейера\кеша, а так же где-то рядом находится некоторая крит. секция (глобальная на все процессы) , контроллирующая и гарантирующая что, в один момент времени только один процесс сможет находиться в ядре.
     
  11. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    с крит. секцией красиво, но проще с interlocked фнукциями.

    Interlocked - это для одного ULONG'а, а у человека буфер с данными.