LINUX.ORG.RU

Common Lisp - потоковые переменные


0

3

Как сделать? Нужно, чтобы special variable по умолчанию была отдельной в каждом потоке выполнения. Пока не смог найти способ, разве только имитировать переменные. Правильно я понимаю, что такого способа нет?

★★★★★

вообще-то, они и так отдельные, и хранятся в TLS, если биндинг устанавливается внутри треда. Если не устанавливается, по умолчанию обращение идет к глобальному значению.

в bordeaux-threads есть *default-special-bindings*, переменные оттуда биндятся при запуске треда.

lovesan

anonymous
()

Как уже сказал lovesan, специальная переменная имеет одно глобальное значение (разделяемое всеми тредами) и тред-локальные биндинги. При наличии тред-локального биндинга используется значение этого биндинга, при его отсутствии - глобальное значение.

dmitry_vk ★★★
()

А вот в продолжение вопроса. Возможно ли полностью изолировать поток от внешнего мира? Т.е. действия функций defvar, defun не были видны в другом потоке. Переопределить функции/макросы в common-lisp?

asvil
()
Ответ на: комментарий от asvil

А вот в продолжение вопроса. Возможно ли полностью изолировать поток от внешнего мира? Т.е. действия функций defvar, defun не были видны в другом потоке. Переопределить функции/макросы в common-lisp?

стандартными средставами - никак, к тому же это противоречит дизайну CL.

да и зачем такая крайность? Можно просто использовать акторную модель, как основу для дизайна приложения.

gensym ★★
()
Ответ на: комментарий от asvil

А вот в продолжение вопроса. Возможно ли полностью изолировать поток от внешнего мира? Т.е. действия функций defvar, defun не были видны в другом потоке. Переопределить функции/макросы в common-lisp?

Да, спокойно, в своём package.

mv ★★★★★
()

Ладно, спасибо, понял вас. Буду искать обходные пути.

Однако, в Дельфи есть такая вещь, как threadvar, которая по умолчанию - отдельная в каждом потоке. Я нахожу её полезной. Наверное, не так сложно добавить подобную фишку в вашу любимую реализацию лиспа. А вот в мою - не знаю.

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ты болван?
к чему приведёт последовательность действий:
(defvar *v* nil)
(setf *v* t) ; в одном потоке
(print *v*) ; в другом потоке

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

тебе же объяснили, что биндинг делаешь свой в каждом треде через, например, let

CL-USER> (setf *v* 2) 2 CL-USER> *v* 2 CL-USER> (let ((*v* 3)) (setf *v* 4) *v*) 4 CL-USER> *v* 2

anonymous
()
Ответ на: комментарий от den73

тебе же объяснили, что биндинг делаешь свой в каждом треде через, например, let

CL-USER> (setf *v* 2)

2

CL-USER> *v*

2

CL-USER> (let ((*v* 3))

(setf *v* 4)

*v*)

4

CL-USER> *v*

2

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.