使用SBCL
信号量(sb-thread
包)时,我可以轻松检查当前的信号量计数,如下面的代码段所示:
CL-USER> (defvar *semaphore* (sb-thread:make-semaphore))
*SEMAPHORE*
CL-USER> (sb-thread::semaphore-count *semaphore*)
0
CL-USER> (sb-thread::signal-semaphore *semaphore*)
NIL
CL-USER> (sb-thread::semaphore-count *semaphore*)
1
我一直试图在Clozure CL
(使用ccl
包)中做同样的事情,但却无法做到。这是一个例子:
CL-USER> (defvar *semaphore* (ccl:make-semaphore))
*SEMAPHORE*
CL-USER> (ccl::semaphore-value *semaphore*)
#<A Foreign Pointer [gcable] #x7F6B240050B0>
当我检查Foreign Pointer
时,这就是我所看到的:
#<MACPTR #x30200080B31D>
--------------------
@0=#<A Foreign Pointer [gcable] #x7F6B240050B0>
Underlying UVECTOR
我无法找到任何方式访问内部计数器,也找不到任何实质性的暗示。我一直在考虑使用外部函数接口并使用sem_getvalue
系统调用,但还不知道如何去做。您对如何访问此计数器有任何建议或见解吗?非常感谢任何帮助。