Скачать MetaTrader 5

Вредный пример в хелпе к GlobalVariableSetOnCondition

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Добавляй наш канал в Twitter'e и следи за новостями!
Forex Trader
114255
Forex Trader 2005.09.27 02:46 
В документации приведен пример использования фунции в качестве мутекса:
Sample

  int init()
    {
     //---- create global variable
     GlobalVariableSet("DATAFILE_SEM",0);
     //...
    }
  
  int start()
    {
     //---- try to lock common resource
     while(!IsStopped())
       {
        //---- locking
        if(GlobalVariableSetOnCondition("DATAFILE_SEM",1,0)==true)  break;
        //---- may be variable deleted?
        if(GetLastError()==ERR_GLOBAL_VARIABLE_NOT_FOUND) return(0);
        //---- sleeping
        Sleep(500);
       }
     //---- resource locked
     // ... do some work
     //---- unlock resource
     GlobalVariableSet("DATAFILE_SEM",0);
    }



Если во время do some work этот эксперт запустится в другом потоке, ресурс будет разблокирован не вовремя и, вероятно, испорчен.

Тема, на самом деле, старая - скрипты инициализации/финализации терминала, на форуме озвучена неоднократно. В текущей реализации race condition неизбежен.

Forex Trader
114255
Forex Trader 2005.09.27 10:57  
да. Вы правы. в инициализации надо также использовать GlobalVariableSetOnCondition. поправим
Forex Trader
114255
Forex Trader 2005.09.27 14:16  
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...
Forex Trader
114255
Forex Trader 2005.09.27 17:52  
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...

сначала GlobalVariableCheck, и если нет, то Set, а если есть, то SetOnCondition ;)
Forex Trader
114255
Forex Trader 2005.09.27 18:05  

сначала GlobalVariableCheck, и если нет, то Set, а если есть, то SetOnCondition ;)

Типичный race condition:

check1
check2
set1
check3
setoncondition3
set2

Каково будет значение глобальной переменной?
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий