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

Тема в разделе "WASM.BEGINNERS", создана пользователем ezhfan, 27 сен 2006.

  1. ezhfan

    ezhfan New Member

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

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

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

    GroundHog New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    35
    Из примера не понять, где происходит рассинхронизация, но можно пока отключить HT для вашего процесса программно. Что-то типа:
    SetProcessAffinityMask(GetCurrentProcess, 1);
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    использовать критические секции для асмовых кусков например
     
  4. ezhfan

    ezhfan New Member

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

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    если нет синхронизации (крит секции) то affinitymask тебя не спасет. Просто ошибка станет проявляться гораздо реже :)
     
  6. ezhfan

    ezhfan New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    4
    Адрес:
    Russia
    Да, ты прав, я это уже понял. Хоть пока и не вылетело, но должно рано или поздно. Чувствую, на winapi перейти надо, дельфовые компоненты кривые нафиг, на пустом месте баги вылезают.