线程安全函数的引用计数
¥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.