Многопотоковые приложения и разгрузка процессора

Тема в разделе "LANGS.C", создана пользователем fakel15, 16 мар 2007.

  1. fakel15

    fakel15 New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2007
    Сообщения:
    3
    Доброго времени суток!
    Начинаю постигать премудрости многопотокового программирования. Продолжаю писать прогу: OPC сервер. При его запуске одновременно стартует поток, внутри него стоит бесконечный цикл
    (типа for( ;; )//мой код})
    там где (//мой код) просходит опрос MODBUS устройств -> получение с них нанных -> обновление тегов OPC сервера.
    ЭТО должно происходить постоянно!!! (т.е. опрос....обновление тегов)
    НО при этом процессор загружается на все 100%!!!
    Наверное есть стандартные алгоритмы работы для многопотоковых программ....сейчас Рихтера осваиваю...))))
    Заранее спасибо, если кто-то поможет...
     
  2. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Нужно ждать на событиях, которые возникают когда что-то изменяется. События должен устанавливать драйвер соотвествующих устройств по прерываниям от них. Если устройства не поддерживают прерываний, то нужно менять устройства.
     
  3. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Чуть спасёт :)

    Код (Text):
    1. for ( ;; ) {
    2.  
    3.     Опрос устройства;
    4.  
    5.     if (Данных нету) {
    6.         Sleep(1); /* переключим контекст */
    7.         continue;
    8.     }
    9.  
    10.     Получение данных;
    11.  
    12.     Обновление тегов;
    13. }
     
  4. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Возможно не в тему, но все-таки интересно:

    Если у меня работают несколько тредов в одном процессе, нужно ли делать синхронизированный доступ (крит. секции, мьютексы) при чтении данных по одим адресам???
    Или достаточно сделать только для записи?
     
  5. fakel15

    fakel15 New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2007
    Сообщения:
    3

    Span
    Если у меня работают несколько тредов в одном процессе, нужно ли делать синхронизированный доступ (крит. секции, мьютексы) при чтении данных по одим адресам???

    ______________________________________________________
    Очень актуальный вопрос!!! Вот сейчас сижу и разгребаю....
     
  6. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Если чтение и запись атомарны, то не нужно. А если данные >4 байт, то нужно, иначе есть риск прочтения данных, в которых инварианты не выполняются.
     
  7. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    А можно про "инварианты" пару слов?
    И где бы про это почитать?

    Реальный пример. Есть структура данных, общая для всех потоков. (там есть DWORDы, указатели на строки и другие структуры)
    Нужно ли доступ на чтение синхронизировать?
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    нет
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    категорично так..

    по теме: нужно, если какие-то другие потоки пишут в эти данные
    правда, если обращение к данным на чтение осуществляется за одну инструкцию процессора, и при этом данные расположены по выровненным адресам, тогда, возможно, синхронизация не обязательна.. по крайней мере на x86. но тогда не обязательно синхронизировать и доступ на запись
    по-моему, лучше защищаться в любом случае, потому что все зависит от особенности реализации одновременного доступа, а эта реализация везде своя
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    синхронизировать нужно почти всё, когда что-то происходит по одному адресу
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    кстати, напомните кто-нибудь.. lock ведь не привилегированная инструкция?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кажется нет
    написано, что в PM может генерировать только #UD:5
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну да.. я все равно решил спросить, потому что не уверен
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Нет, конечно, — синхронизироваться приложениям тоже ведь надо.

    Не совсем так. Вообще, синхронизация нужна для исключения противоположной ситуации: рассинхронизации. Выше говорили почти правильно, только нужно думать не о байтах и двордах, а о некоторых законченных сущностях: для переменной размером в 1 байт это байт, для дворда это дворд, а для структуры — это вся структура: нельзя допускать, чтобы структура была обновлена только частично! (если это не сделано намеренно)

    Если данные не обновляются, то для простого чтения синхронизировать ничего не нужно; если же один или более потоков пишут в данные, то здесь уже нужна синхронизация, как для чтения, так и для записи: префикс lock для данных, размер которых не превышает 4 байта (в общем случае), критические секции, мьютексы, семафоры и т.п. — для остальных случаев.

    halyavin
    Для ассемблера :) Для ЯВУ нужно явно указывать, что переменная может быть изменена из других потоков (ключевое слово volatile для С/С++).

    Span
    (Инвариант.) Здесь имелось ввиду то, о чём я сказал выше: чтобы сущность данных (экземпляр структуры, класса) оставалась логически целостной до и после записи в неё.