线程安全函数的引用计数
¥Reference counting of thread-safe functions
在 napi_threadsafe_function
对象存在期间,可以将线程添加到 napi_threadsafe_function
对象或从中删除。因此,除了在创建时指定线程的初始数量外,还可以调用 napi_acquire_threadsafe_function
来指示新线程将开始使用线程安全函数。同样,可以调用 napi_release_threadsafe_function
来指示现有线程将停止使用线程安全函数。
¥Threads can be added to and removed from a napi_threadsafe_function
object
during its existence. Thus, in addition to specifying an initial number of
threads upon creation, napi_acquire_threadsafe_function
can be called to
indicate that a new thread will start making use of the thread-safe function.
Similarly, napi_release_threadsafe_function
can be called to indicate that an
existing thread will stop making use of the thread-safe function.
当使用该对象的每个线程调用 napi_release_threadsafe_function()
或收到 napi_closing
的返回状态以响应对 napi_call_threadsafe_function
的调用时,napi_threadsafe_function
对象将被销毁。在 napi_threadsafe_function
被销毁之前队列被清空。napi_release_threadsafe_function()
应该是与给定的 napi_threadsafe_function
一起进行的最后一次 API 调用,因为在调用完成后,无法保证 napi_threadsafe_function
仍然被分配。出于同样的原因,在收到 napi_closing
的返回值以响应对 napi_call_threadsafe_function
的调用后,不要使用线程安全函数。可以在传递给 napi_create_threadsafe_function()
的 napi_finalize
回调中释放与 napi_threadsafe_function
关联的数据。napi_create_threadsafe_function
的参数 initial_thread_count
表示线程安全函数的初始获取次数,而不是在创建时多次调用 napi_acquire_threadsafe_function
。
¥napi_threadsafe_function
objects are destroyed when every thread which uses
the object has called napi_release_threadsafe_function()
or has received a
return status of napi_closing
in response to a call to
napi_call_threadsafe_function
. The queue is emptied before the
napi_threadsafe_function
is destroyed. napi_release_threadsafe_function()
should be the last API call made in conjunction with a given
napi_threadsafe_function
, because after the call completes, there is no
guarantee that the napi_threadsafe_function
is still allocated. For the same
reason, do not use a thread-safe function
after receiving a return value of napi_closing
in response to a call to
napi_call_threadsafe_function
. Data associated with the
napi_threadsafe_function
can be freed in its napi_finalize
callback which
was passed to napi_create_threadsafe_function()
. The parameter
initial_thread_count
of napi_create_threadsafe_function
marks the initial
number of acquisitions of the thread-safe functions, instead of calling
napi_acquire_threadsafe_function
multiple times at creation.
一旦使用 napi_threadsafe_function
的线程数达到零,则没有其他线程可以通过调用 napi_acquire_threadsafe_function()
开始使用它。事实上,除 napi_release_threadsafe_function()
之外的所有后续 API 调用都将返回错误值 napi_closing
。
¥Once the number of threads making use of a napi_threadsafe_function
reaches
zero, no further threads can start making use of it by calling
napi_acquire_threadsafe_function()
. In fact, all subsequent API calls
associated with it, except napi_release_threadsafe_function()
, will return an
error value of napi_closing
.
线程安全函数可以通过给 napi_release_threadsafe_function()
赋值 napi_tsfn_abort
来实现 "aborted"。这将导致除 napi_release_threadsafe_function()
之外与线程安全函数关联的所有后续 API 甚至在其引用计数达到零之前就返回 napi_closing
。特别是,napi_call_threadsafe_function()
将返回 napi_closing
,从而通知线程不再可能对线程安全函数进行异步调用。这可以用作终止线程的标准。从 napi_call_threadsafe_function()
接收到 napi_closing
的返回值后,线程不得再使用线程安全函数,因为不再保证会分配它。
¥The thread-safe function can be "aborted" by giving a value of napi_tsfn_abort
to napi_release_threadsafe_function()
. This will cause all subsequent APIs
associated with the thread-safe function except
napi_release_threadsafe_function()
to return napi_closing
even before its
reference count reaches zero. In particular, napi_call_threadsafe_function()
will return napi_closing
, thus informing the threads that it is no longer
possible to make asynchronous calls to the thread-safe function. This can be
used as a criterion for terminating the thread. Upon receiving a return value
of napi_closing
from napi_call_threadsafe_function()
a thread must not use
the thread-safe function anymore because it is no longer guaranteed to
be allocated.