40.1 Основные функции потоков

Потоки могут быть созданы и на них можно ждать. Поток не может быть завершен напрямую, но текущий поток может быть завершен неявно, а другим потокам можно отправить сигнал.

Функция: make-thread function &optional name

Создает новый поток выполнения, который вызывает function. Когда function возвращает значение, поток завершается.

Новый поток создается без активных привязок локальных переменных. Текущий буфер нового потока наследуется от текущего потока.

name может быть предоставлен для присвоения имени потоку. Имя используется только для отладки и информационных целей; для Emacs оно не имеет значения. Если name предоставлен, это должна быть строка.

Эта функция возвращает новый поток.

Функция: threadp object

Эта функция возвращает t, если object представляет поток Emacs, иначе nil.

Функция: thread-join thread

Блокирует выполнение до тех пор, пока thread не завершится или пока не будет отправлен сигнал текущему потоку. Возвращает результат функции thread. Если thread уже завершился, он возвращает результат немедленно.

Функция: thread-signal thread error-symbol data

Подобно signal (см. Как отправить ошибку), но сигнал доставляется в поток thread. Если thread — это текущий поток, то это просто вызывает signal немедленно. В противном случае thread получит сигнал, как только станет текущим. Если thread был заблокирован вызовом mutex-lock, condition-wait или thread-join, то thread-signal разблокирует его.

Если thread — это основной поток, сигнал не передается туда. Вместо этого он отображается как сообщение в основном потоке.

Функция: thread-yield

Передает выполнение следующему готовому к выполнению потоку.

Функция: thread-name thread

Возвращает имя thread, указанное при вызове make-thread.

Функция: thread-live-p thread

Возвращает t, если thread активен, или nil, если он не активен. Поток активен до тех пор, пока его функция выполняется.

Функция: thread--blocker thread

Возвращает объект, на котором thread ожидает. Эта функция предназначена в первую очередь для отладки, и ей дано имя с «двойным дефисом», чтобы это было очевидно.

Если thread заблокирован в thread-join, он возвращает поток, на котором он ожидает.

Если thread заблокирован в mutex-lock, он возвращает мьютекс.

Если thread заблокирован в condition-wait, он возвращает переменную условия.

В противном случае он возвращает nil.

Функция: current-thread

Возвращает текущий поток.

Функция: all-threads

Возвращает список всех активных объектов потоков. При каждом вызове возвращается новый список.

Переменная: main-thread

Эта переменная хранит основной поток, в котором запущен Emacs, или nil, если Emacs скомпилирован без поддержки потоков.

Когда код, выполняемый потоком, вызывает необработанную ошибку, поток завершается. Другие потоки могут получить доступ к форме ошибки, вызвавшей завершение потока, с помощью следующей функции.

Функция: thread-last-error &optional cleanup

Эта функция возвращает последнюю форму ошибки, записанную, когда поток завершился из-за ошибки. Каждый поток, завершившийся с ошибкой, перезаписывает форму, сохраненную предыдущим потоком, новым значением, поэтому доступен только последний. Если cleanup не равен nil, сохраненная форма сбрасывается в nil.