tsv
-
NAME
- tsv — Часть расширения Tcl для потоков, позволяющая на уровне скрипта манипулировать данными, общими для нескольких потоков.
- SYNOPSIS
- DESCRIPTION
- ELEMENT COMMANDS
-
tsv::names ?pattern?
- tsv::object varname element
- tsv::set varname element ?value?
- tsv::get varname element ?namedvar?
- tsv::unset varname ?element?
- tsv::exists varname element
- tsv::pop varname element
- tsv::move varname oldname newname
- tsv::incr varname element ?count?
- tsv::append varname element value ?value . . .?
- tsv::lock varname arg ?arg . . .?
- tsv::handlers
- tsv::object varname element
-
tsv::lappend varname element value ?value . . .?
- tsv::linsert varname element index value ?value . . .?
- tsv::lreplace varname element first last ?value . . .?
- tsv::llength varname element
- tsv::lindex varname element ?index?
- tsv::lrange varname element from to
- tsv::lsearch varname element ?options? pattern
- tsv::lset varname element index ?index . . .? value
- tsv::lpop varname element ?index?
- tsv::lpush varname element ?index?
- tsv::linsert varname element index value ?value . . .?
-
tsv::array set varname list
- tsv::array get varname ?pattern?
- tsv::array names varname ?pattern?
- tsv::array size varname
- tsv::array reset varname list
- tsv::array bind varname handle
- tsv::array unbind varname
- tsv::array isbound varname
- tsv::array get varname ?pattern?
-
tsv::keyldel varname keylist key
- tsv::keylget varname keylist key ?retvar?
- tsv::keylkeys varname keylist ?key?
- tsv::keylset varname keylist key value ?key value . .?
- tsv::keylget varname keylist key ?retvar?
Имя
tsv — Часть расширения Tcl для потоков, позволяющая на уровне скрипта манипулировать данными, общими для нескольких потоков.Синтаксис
package require Tcl 8.4package require Thread ?2.8?
tsv::names ?pattern?
tsv::objectvarnameelement
tsv::setvarnameelement ?value?
tsv::getvarnameelement ?namedvar?
tsv::unsetvarname ?element?
tsv::existsvarnameelement
tsv::popvarnameelement
tsv::movevarnameoldnamenewname
tsv::incrvarnameelement ?count?
tsv::appendvarnameelementvalue ?value . . .?
tsv::lockvarnamearg ?arg . . .?
tsv::handlers
tsv::lappendvarnameelementvalue ?value . . .?
tsv::linsertvarnameelementindexvalue ?value . . .?
tsv::lreplacevarnameelementfirstlast ?value . . .?
tsv::llengthvarnameelement
tsv::lindexvarnameelement ?index?
tsv::lrangevarnameelementfromto
tsv::lsearchvarnameelement ?options? pattern
tsv::lsetvarnameelementindex ?index . . .? value
tsv::lpopvarnameelement ?index?
tsv::lpushvarnameelement ?index?
tsv::array setvarnamelist
tsv::array getvarname ?pattern?
tsv::array namesvarname ?pattern?
tsv::array sizevarname
tsv::array resetvarnamelist
tsv::array bindvarnamehandle
tsv::array unbindvarname
tsv::array isboundvarname
tsv::keyldelvarnamekeylistkey
tsv::keylgetvarnamekeylistkey ?retvar?
tsv::keylkeysvarnamekeylist ?key?
tsv::keylsetvarnamekeylistkeyvalue ?key value . .?
Описание
Данный раздел описывает команды, реализующие переменные, общие для потоков. Переменная, общая для потоков, очень похожа на массив Tcl, но в отличие от массива Tcl она создается в общей памяти и может быть обращена к ней из многих потоков одновременно. Важной особенностью переменной, общей для потоков, является то, что каждый доступ к переменной внутренне защищен мьютексом, поэтому программисту не нужно заботиться о блокировке переменной самостоятельно.Переменные, общие для потоков, явно не привязаны к какому-либо потоку. Это означает, что когда поток, создавший переменные, общие для потоков, завершает работу, переменная и связанная с ней память не удаляются. Пользователь должен явно удалить переменную, чтобы освободить память, занимаемую переменной.
Команды элементов
- tsv::names ?pattern?
- Возвращает имена общих переменных, соответствующих необязательному ?pattern?, или все известные переменные, если pattern опущен.
- tsv::object varname element
- Создает команду доступа к объекту для element в общей переменной varname. Используя эту команду, можно применить большинство других команд для общих переменных как методы команд объекта элемента. Команда объекта автоматически удаляется, когда элемент, на который она указывает, удаляется.
% tsv::set foo bar "A shared string" % set string [tsv::object foo bar] % $string append " appended" => A shared string appended - tsv::set varname element ?value?
- Устанавливает значение element в общей переменной varname в value и возвращает значение вызывающей стороне. value можно опустить, в этом случае команда вернет текущее значение элемента. Если элемент не найден, генерируется ошибка.
- tsv::get varname element ?namedvar?
- Извлекает значение element из общей переменной varname. Если необязательный аргумент namedvar задан, значение сохраняется в именованной переменной. Возвращаемое значение команды зависит от наличия необязательного аргумента namedvar. Если аргумент опущен, и запрашиваемый элемент не найден в общем массиве, команда генерирует ошибку. Если же необязательный аргумент указан, команда возвращает true (1), если элемент найден, или false (0), если элемент не найден.
- tsv::unset varname ?element?
- Удаляет element из общей переменной varname. Если необязательный элемент не задан, удаляет всю переменную.
- tsv::exists varname element
- Проверяет, существует ли element в общей переменной varname, и возвращает true (1), если существует, или false (0), если нет.
- tsv::pop varname element
- Возвращает значение element в общей переменной varname и удаляет элемент в одном атомарном действии.
- tsv::move varname oldname newname
- Переименовывает элемент oldname в newname в общей переменной varname. Это фактически выполняет последовательность операций get/unset/set, но все в одном атомарном шаге.
- tsv::incr varname element ?count?
- Аналогично стандартной команде Tcl incr, но инкрементирует значение element в общей переменной varname вместо переменной Tcl.
- tsv::append varname element value ?value . . .?
- Аналогично стандартной команде Tcl append, но добавляет одно или несколько значений к element в общей переменной varname вместо переменной Tcl.
- tsv::lock varname arg ?arg . . .?
- Эта команда конкатенирует переданные аргументы и вычисляет полученный скрипт под защитой внутреннего мьютекса. Во время вычисления скрипта вся общая переменная блокируется. Для команд общих переменных внутри скрипта внутренняя блокировка отключена, поэтому не может произойти тупик. Также разрешено удалить общую переменную изнутри скрипта. Общая переменная автоматически создается, если она не существовала во время первой операции lock.
% tsv::lock foo { tsv::lappend foo bar 1 tsv::lappend foo bar 2 puts stderr [tsv::set foo bar] tsv::unset foo } - tsv::handlers
- Возвращает имена всех постоянных обработчиков хранения, включенных во время компиляции. Подробности см. в разделе ARRAY COMMANDS.
Команды списков
Эти команды похожи на команды Tcl с аналогичным названием. Разница в том, что они работают с элементами общих массивов.- tsv::lappend varname element value ?value . . .?
- Похожа на стандартную команду Tcl lappend, но добавляет одно или несколько значений к элементу element в общей переменной varname, а не в переменную Tcl.
- tsv::linsert varname element index value ?value . . .?
- Похожа на стандартную команду Tcl linsert, но вставляет одно или несколько значений в позицию списка index в элементе element общей переменной varname вместо переменной Tcl.
- tsv::lreplace varname element first last ?value . . .?
- Похожа на стандартную команду Tcl lreplace, но заменяет одно или несколько значений между позициями first и last в элементе element общей переменной varname вместо переменной Tcl.
- tsv::llength varname element
- Похожа на стандартную команду Tcl llength, но возвращает длину элемента element в общей переменной varname вместо переменной Tcl.
- tsv::lindex varname element ?index?
- Похожа на стандартную команду Tcl lindex, но возвращает значение в позиции списка index элемента element из общей переменной varname вместо переменной Tcl.
- tsv::lrange varname element from to
- Похожа на стандартную команду Tcl lrange, но возвращает значения между позициями from и to в элементе element общей переменной varname вместо переменной Tcl.
- tsv::lsearch varname element ?options? pattern
- Похожа на стандартную команду Tcl lsearch, но ищет элемент element в общей переменной varname вместо переменной Tcl.
- tsv::lset varname element index ?index . . .? value
- Похожа на стандартную команду Tcl lset, но устанавливает элемент element в общей переменной varname вместо переменной Tcl.
- tsv::lpop varname element ?index?
- Похожа на стандартную команду Tcl lindex, но помимо возврата также вырезает значение из элемента element из общей переменной varname в одной атомарной операции. В отличие от команды Tcl lindex, эта команда не возвращает значение вызывающей стороне.
- tsv::lpush varname element ?index?
- Эта команда выполняет обратное действие команды tsv::lpop. Как и её аналог, она не возвращает значение вызывающей стороне.
Команды массивов
Эта команда поддерживает большинство опций стандартной команды Tcl array. Помимо этого, она позволяет привязать общую переменную к базам данных с постоянным хранением. В настоящее время поддерживаются базы данных GNU Gdbm и LMDB. Эти опции должны быть выбраны во время компиляции пакета. Реализация предоставляет средства для определения других уровней постоянного хранения, если это необходимо.- tsv::array set varname list
- Делает то же, что и стандартная команда Tcl array set.
- tsv::array get varname ?pattern?
- Делает то же, что и стандартная команда Tcl array get.
- tsv::array names varname ?pattern?
- Делает то же, что и стандартная команда Tcl array names.
- tsv::array size varname
- Делает то же, что и стандартная команда Tcl array size.
- tsv::array reset varname list
- Делает то же, что и стандартная команда Tcl array set, но очищает varname и устанавливает новые значения из списка атомарно.
- tsv::array bind varname handle
- Привязывает varname к постоянному хранилищу handle. Формат handle — <handler>:<address>, где <handler> — "gdbm" для GNU Gdbm и "lmdb" для LMDB, а <address> — путь к файлу базы данных.
- tsv::array unbind varname
- Отвязывает общий массив от привязанного постоянного хранилища.
- tsv::array isbound varname
- Возвращает true (1), если общий varname привязан к постоянному хранилищу, или ноль (0), если нет.
Команды списков с ключами
Команды списков с ключами позаимствованы из пакета TclX. Списки с ключами предоставляют структурированный тип данных, основанный на стандартных списках Tcl. Это функциональность, похожая на структуры в языке программирования C.Список с ключами — это список, в котором каждый элемент содержит пару ключ-значение. Эти пары элементов хранятся как списки, где ключ — первый элемент списка, а значение — второй. Пары ключ-значение называются полями. Вот пример списка с ключами:
{{NAME {Frank Zappa}} {JOB {musician and composer}}} Поля могут содержать подполя; ` .' — разделитель. Подполя — это на самом деле поля, где значение — другой список с ключами. Таким образом, следующий список имеет поля верхнего уровня ID и NAME и подполя NAME.FIRST и NAME.LAST: {ID 106} {NAME {{FIRST Frank} {LAST Zappa}}} Глубина рекурсии подполей не ограничена, что позволяет создавать сложные структуры данных. Список с ключами создается и извлекается с помощью ряда команд. Все команды управления списками с ключами принимают имя переменной, содержащей список с ключами (передаётся по ссылке), а не передают сам список напрямую.
- tsv::keyldel varname keylist key
- Удаляет поле, указанное ключом key, из списка с ключами keylist в общей переменной varname. Это удаляет и ключ, и значение из списка с ключами.
- tsv::keylget varname keylist key ?retvar?
- Возвращает значение, связанное с ключом key, из списка с ключами keylist в общей переменной varname. Если необязательный retvar не указан, значение возвращается как результат команды. В этом случае, если ключ не найден в списке, произойдёт ошибка.
Если retvar указан и key находится в списке, значение возвращается в переменную retvar, а команда возвращает 1, если ключ был присутствовал в списке. Если key нет в списке, команда возвращает 0, а retvar остаётся неизменным. Если для retvar указано {}, значение не возвращается, что позволяет программисту Tcl определить, присутствует ли key в списке с ключами, не устанавливая переменную как побочный эффект.
- tsv::keylkeys varname keylist ?key?
- Возвращает список ключей в списке с ключами keylist в общей переменной varname. Если указан key, это имя поля ключа, подполя ключей которого необходимо получить.
- tsv::keylset varname keylist key value ?key value . .?
- Устанавливает значение, связанное с ключом key, в списке с ключами keylist, в значение value. Если keylist не существует, он создаётся. Если key в данный момент не находится в списке, он будет добавлен. Если он уже существует, value заменяет существующее значение. При необходимости можно указать несколько ключевых слов и значений.
Обсуждение
Текущая реализация переменных с общим доступом для потоков позволяет легко и удобно получать доступ к данным, общим для различных потоков. Внутренне данные хранятся в объектах Tcl, и все команды пакета работают с внутренней структурой данных, минимизируя мерцание и улучшая производительность. Особое внимание уделено обеспечению правильной блокировки и глубокого копирования всех данных объектов при перемещении объектов между потоками.К сожалению, из-за внутренней структуры ядра Tcl нет возможности для полной интеграции переменных с общим доступом в синтаксис Tcl. Весь доступ к общим данным должен осуществляться с помощью предоставленных команд пакета. Также не поддерживаются отслеживания переменных. Но даже так, преимущества лёгкого, простого и безопасного управления общими данными перевешивают наложенные ограничения.
Авторы
Переменные с общим доступом для потоков вдохновлены интерфейсом nsv в AOLserver, высокомасштабируемом веб-сервере от America Online.См. также
thread, tpool, ttrace
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ThreadCmd/tsv.htm