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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114496
Forex Trader  
В документации приведен пример использования фунции в качестве мутекса:
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
114496
Forex Trader  
да. Вы правы. в инициализации надо также использовать GlobalVariableSetOnCondition. поправим
Forex Trader
114496
Forex Trader  
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...
Forex Trader
114496
Forex Trader  
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...

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

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

Типичный race condition:

check1
check2
set1
check3
setoncondition3
set2

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