Как заработать деньги. Проект сам себе финансист.
июль 2011
пн вт ср чт пт сб вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Главная » » »

"Критическая секция": разграничение доступа к ресурсу

В данной статье будет рассказано о способе организации "критической секции" в советнике.

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

Для того, чтобы избежать этого, мы создадим объект "критическая секция", который может находиться в двух состояниях:

  • "зеленый свет" (-1); и
  • "красный свет" (1).
  • В каждый конкретный момент только один советник может получить доступ к данным. Пока советник получает данные, будет гореть "красный свет" и другие советники будут ждать "зеленового света". Если горит "зеленый свет", то дорога свободна, т. к. никто в данный момент к данным не обращается.

    Напишем две функции:

    • Lock() - вызываем ее перед началом работы с ресурсом. Функция ждет "зеленового света" и меняет его на "красный".
    • Unlock() - обязательно вызываем ее после окончания работы с ресурсом, чтобы снова зажечь "зеленый свет".

    Вот исходный код этих функций:

     
    // Lock()  
    // 
    // Возвращает:  
    // 0 - если "критическая секция" успешно  
    // заблокирована | 
    // 1 - в случае ошибки  
    // 2 - эксперт остановлен  
    // 3 - по таймауту (слишком долго ждали)  
    // int Lock(string GlobVarName, int timeout = 0) { string critical_section = GlobVarName+"Lock";
    // проверим, существует ли переменная critical_section if (!GlobalVariableCheck(critical_section)) 
    { 
    if (GetLastError()!=0) return(1);
    // переменная не существует, создадим ее if (GlobalVariableSet(critical_section, -1.0)==0) return(1); 
    // переменная создана }
    int StartTime = GetTickCount();
    // ждем "зеленового света" while (true) 
    { 
    // проверить, не загорелся ли "зеленый свет" if (GlobalVariableGet(critical_section)==-1.0) 
    { 
    // "зеленый свет" загорелся, зажигаем "красный свет" if (GlobalVariableSetOnCondition(critical_section, 1.0, -1.0)) return(0);
    // нас опередили, поэтому ждем "зеленового света" }
    // проверим, не остановлен ли эксперт if (IsStopped()) return(2);
    // таймаут не истек? if (timeout!=0) 
    { if ((GetTickCount()-StartTime)>timeout*1000) return(3); }
    // спим 0.1 секунды Sleep(100); } }
    //
    // Unlock() 
    //
    //Возвращает: 
    // 0 - если "критическая секция" успешно 
    // разблокирована 
    // 1 - в случае ошибки 
    // 2 - эксперт остановлен | //| 3 - по таймауту (слишком долго ждали)  // int Unlock(string GlobVarName, int timeout = 0) 
    { string critical_section = GlobVarName+"Lock";
    // проверим, существует ли переменная critical_section if (!GlobalVariableCheck(critical_section)) 
    { if (GetLastError()!=0) return(1);
    // переменная не существует, создадим ее if (GlobalVariableSet(critical_section, -1.0)==0) return(1);
    // переменная создана, поэтому выходим return(-1.0); }
    int StartTime = GetTickCount();
    // бесконечный цикл while (true) 
    { 
    // пытаемся установить "зеленый свет" if (GlobalVariableSetOnCondition(critical_section, -1.0, 1.0)) return(0);
    // проверим, не остановлен ли эксперт if (IsStopped()) return(2);
    // таймаут не истек? 
    if (timeout!=0) 
    { if ((GetTickCount()-StartTime)>timeout*1000) return(3); }
    // спим 0.1 секунды Sleep(100); } } 
    

    В следующей статье разберем код этих функций подробней.



    Автор статьи: Андрей Ведихин

    Хомячковый рай. Уйти и потеряться:

    Комментарии к этой заметке больше не принимаются.




    Есть что сказать? Не стесняйтесь!


    Данную страницу никто не комментировал. Вы можете стать первым.

    Ваше имя:
    Ваша почта:

    Комментарий:






    Последние статьи:

    Выгодные «исламские счета» для трейдеров Форекс Выгодные «исламские счета» для трейдеров Форекс Таким образом, вне зависимости от стиля работы стоит использовать «исламские счета» и сотрудничать с компаниями, которые не берут с трейдеров swap-комиссии. ..
    2014-09-29
    Стоит ли покупать чужие торговые сигналы и прогнозы? Стоит ли покупать чужие торговые сигналы и прогнозы? И все же основным нашим советом станет отказ от покупки торговых сигналов и прогнозов. Куда лучше научиться анализировать валютный рынок и думать всегда только своей головой. ..
    2015-02-12

    Видео по теме:




    В мире больших денег

    • Самые богатые люди
      планеты. Ежегодные рейтинги FORBS. Истории успеха признаных финансовых гуру
    • Самые дорогие вещи:
      Часы, автомобили, ноутбуки стоимотью в десятки и сотни тысяч долларов. Рубрика "Чтоб я так жил"
    • Денежные прогнозы
      Что покупать и что продавать? Периодические прогнозы цен на иностранные валюты, акции крупнейших компаний и драгоценные металлы

    ВКонтакте с деньгами

    УГОЛОК АДМИНИСТРАТОРА