Методы Lock и Unlock используются для создания глобальной критической секции при необходимости обеспечения синхронизации скриптов, запускаемых в отдельных потоках. Метод Lock открывает критическую секцию, метод Unlock закрывает.

Внимание!

Необходимо обязательно вызывать метод Unlock, если был вызван метод Lock. В противном случае система может зависнуть.

Рекомендуется по возможности избегать использования методов Lock и Unlock.

Синтаксис обращения к методам:

function Lock()
function Unlock()

Пример. По макрокоманде 1 посчитать общее количество лучей и реле, находящихся в тревоге. Подсчет объектов каждого типа производить одновременно (в отдельном скрипте). Результат записать в глобальную переменную counter.

Скрипт 1:

//Считается количество реле в тревоге
var i = Number(0);
if (Event.SourceType == "MACRO" && Event.SourceId== "1" && Event.Action == "RUN")
{
	var msg = CreateMsg();
	msg.StringToMsg(GetObjectIds("GRELE"));
	var objCount = msg.GetParam("id.count");
	var k;
	for(k= 0; k < objCount; k++)
		if(GetObjectState("GRELE", msg.GetParam("id." + k))== "ALARM"){
			Lock();
			i = Itv_var("counter");
			i++;
			Itv_var("counter")=i;
			Unlock();
		}
}

Скрипт 2:

//Считается количество лучей в тревоге
var i = Number(0);
if (Event.SourceType == "MACRO" && Event.SourceId== "1" && Event.Action == "RUN")
{
	var msg = CreateMsg();
	msg.StringToMsg(GetObjectIds("GRAY"));
	var objCount = msg.GetParam("id.count");
	var k;
	for(k = 0; k < objCount; k++)
		if(GetObjectState("GRAY", msg.GetParam("id." + k))== "ALARMED"){
			Lock();
			i = Itv_var("counter");
			i++;
			Itv_var("counter")=i;
			Unlock();
	}
}

Примечание.

Если в данном примере не использовать методы Lock() и Unlock(), могут возникнуть коллизии и посчитанное значение окажется меньше, чем реальное.