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

 
В документации приведен пример использования фунции в качестве мутекса:
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 неизбежен.

 
да. Вы правы. в инициализации надо также использовать GlobalVariableSetOnCondition. поправим
 
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...
 
Боюсь, что в текущей нотации, когда GlobalVariableSetOnCondition не способна создать переменную, эта функция ничего принциально отличного от GlobalVariableSet для инициализации сделать не сможет.
Впрочем, если Вы приведете пример такой инициализации...

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

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

Типичный race condition:

check1
check2
set1
check3
setoncondition3
set2

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