Синхронизация обращений к памяти из разных потоков с Hyper Threading.

Discussion in 'WASM.BEGINNERS' started by ezhfan, Sep 27, 2006.

  1. ezhfan

    ezhfan New Member

    Blog Posts:
    0
    Итак, программа на Delphi.
    Если HyperThreading включен, программа вылетает с ошибкой Access Violation или вообще без ошибки. Как повезёт.
    Если HyperThreading выключен - всё работает идеально :)
    Программу пишу на делфи, проблема возникает в местах, похожих на это:
    mov eax, [eax]
    mov [edx], eax
    mov [eax+4], edx <- Access Violation

    Приложение многопоточное, обращение к общим переменным синхронизирую с помощью InterlockedExchange. Но тут код компилиться в ассемблер, и я не могу синхронизировать такие вот "кусочки".

    Что делать? Есть решение проблемы более прямое, нежели отключение HT?
     
  2. GroundHog

    GroundHog New Member

    Blog Posts:
    0
    Из примера не понять, где происходит рассинхронизация, но можно пока отключить HT для вашего процесса программно. Что-то типа:
    SetProcessAffinityMask(GetCurrentProcess, 1);
     
  3. infern0

    infern0 New Member

    Blog Posts:
    0
    использовать критические секции для асмовых кусков например
     
  4. ezhfan

    ezhfan New Member

    Blog Posts:
    0
    Класс! Как-то в голову не пришло.
    SetProcessAffinityMask рулит :)
    А ассемблерных вставок у меня нет - данный код - это то, что получается при компиляции. Т.е. одновременно юзается один элемент класса двумя потоками. Кто-то пишет, а кто-то читает.
     
  5. infern0

    infern0 New Member

    Blog Posts:
    0
    если нет синхронизации (крит секции) то affinitymask тебя не спасет. Просто ошибка станет проявляться гораздо реже :)
     
  6. ezhfan

    ezhfan New Member

    Blog Posts:
    0
    Да, ты прав, я это уже понял. Хоть пока и не вылетело, но должно рано или поздно. Чувствую, на winapi перейти надо, дельфовые компоненты кривые нафиг, на пустом месте баги вылезают.