Атомарные операции для многопоточности в SBCL - PullRequest
1 голос
/ 08 марта 2019

Я получаю сообщение об ошибке при загрузке функции, содержащей атомарную операцию.В качестве простого примера, файл test.lisp содержит:

(defparameter *count* 0)
(defun test ()
  (sb-ext:atomic-incf *count*))

, который генерирует следующую ошибку:

* (load "d:\\test.lisp")

; file: d:/test.lisp
; in: DEFUN TEST
;     (ATOMIC-INCF *COUNT*)
;
; caught ERROR:
;   during macroexpansion of (ATOMIC-INCF *COUNT*). Use *BREAK-ON-SIGNALS* to
;   intercept.
;
;    Invalid first argument to ATOMIC-INCF: *COUNT*
;
; compilation unit finished
;   caught 1 ERROR condition
T
*

Почему *count* неверен?

1 Ответ

3 голосов
/ 08 марта 2019

Из строки документации:

PLACE must access one of the following:
 - a DEFSTRUCT slot with declared type (UNSIGNED-BYTE 64)
   or AREF of a (SIMPLE-ARRAY (UNSIGNED-BYTE 64) (*))
   The type SB-EXT:WORD can be used for these purposes.
 - CAR or CDR (respectively FIRST or REST) of a CONS.
 - a variable defined using DEFGLOBAL with a proclaimed type of FIXNUM.
Macroexpansion is performed on PLACE before expanding ATOMIC-INCF.

Я подозреваю, что они существуют, чтобы избежать проверок во время выполнения при выполнении сравнения и замены.

...