Блокировка объекта
Блокировка — это встроенный объект, который можно использовать для управления одновременным доступом к волокнам. Вы можете получить блокировку через одно волокно, чтобы предотвратить одновременное получение его другими волокнами. Замок может пройтиcoroutine.Lock() создание функции
Распространенной ситуацией является то, что в многопоточном сценарии, когда несколько потоков хотят изменить одни и те же данные, возникает несогласованность данных. Например, если два потока хотят изменить одно и то же значение в одних и тех же данных, результаты могут быть противоречивыми, если управление неподходящее. В настоящее время с помощью объекта Lock можно добиться взаимоисключающего доступа к одним и тем же данным.
Ниже приведен простой пример использования Lock для реализации поочередного выполнения двух волокон, а значение общей переменной v не равно 300.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var coroutine = require("coroutine")
var l = new coroutine.Lock()
var v = 100
function f() {
l.acquire()
v = 200
coroutine.sleep(1)
v = 300
l.release()
}
coroutine.start(f)
coroutine.sleep(1)
l.acquire()
assert.notEqual(300, v)
assert.equal(200, v)
l.release()
Сначала создается объект Lock, входит в волокно f, получает блокировку, изменяет переменную v, а затем снимает блокировку. В основном потоке дождитесь завершения волокна f... Когда волокно f освобождает блокировку, основной поток начинает получать блокировку и гарантирует, что значение переменной v изменится на 300.
отношения наследства
Конструктор
Lock
Конструктор
1new Lock();
функция-член
acquire
Получить право собственности на замок
1Boolean Lock.acquire(Boolean blocking = true);
Параметры звонка:
- blocking: логическое значение, указывает, ждать ли, ждать, если true, по умолчанию true
Результаты возврата:
- Boolean, возвращает информацию о том, была ли блокировка успешно получена, true указывает на успешное получение.
Метод получения используется для получения права собственности на блокировку. Когда блокировка находится в состоянии получения, этот метод немедленно возвращает значение true.
Если блокировка не может быть получена и блокировка истинна, текущее волокно переходит в режим сна. Когда другие волокна снимают блокировку, этот метод возвращает true.
Если блокировку невозможно получить и блокировка имеет значение false, метод возвращает false.
release
Освободить право собственности на замок
1Lock.release();
Этот метод освободит право собственности на блокировку или выдаст ошибку, если текущее волокно не владеет блокировкой.
count
Запрос текущего количества ожидающих задач
1Integer Lock.count();
Результаты возврата:
- Integer, возвращает количество задач
toString
Возвращает строковое представление объекта. Обычно возвращается «[Native Object]». Объект может быть повторно реализован в соответствии с его собственными характеристиками.
1String Lock.toString();
Результаты возврата:
- String, возвращает строковое представление объекта
toJSON
Возвращает представление объекта в формате JSON, обычно возвращая коллекцию читаемых свойств, определенных объектом.
1Value Lock.toJSON(String key = "");
Параметры звонка:
- key: Строка, не используется.
Результаты возврата:
- Value, возвращает значение, содержащее сериализуемый JSON