场景介绍
napi_create_threadsafe_function是Node-API接口之一,用于创建一个线程安全的JavaScript函数。主要用于在多个线程之间共享和调用,而不会出现竞争条件或死锁。例如以下场景:
- 异步计算:如果需要进行耗时的计算或IO操作,可以创建一个线程安全的函数,将计算或IO操作放在另一个线程中执行,避免阻塞主线程,提高程序的响应速度。
- 数据共享:如果多个线程需要访问同一份数据,可以创建一个线程安全的函数,确保数据的读写操作不会发生竞争条件或死锁等问题。
- 多线程编程:如果需要进行多线程编程,可以创建一个线程安全的函数,确保多个线程之间的通信和同步操作正确无误。
使用示例
1.在Native入口定义线程安全函数。
struct CallbackData {
napi_threadsafe_function tsfn;
napi_async_work work;
};
static napi_value StartThread(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value jsCb = nullptr;
CallbackData *callbackData = nullptr;
napi_get_cb_info(env, info, &argc, &jsCb, nullptr, reinterpret_cast<void **>(&callbackData));
// 创建一个线程安全函数
napi_value resourceName = nullptr;
napi_create_string_utf8(env, "Thread-safe Function Demo", NAPI_AUTO_LENGTH, &resourceName);
napi_create_threadsafe_function(env, jsCb, nullptr, resourceName, 0, 1, callbackData, nullptr,
callbackData, CallJs, &callbackData->tsfn);
// 创建一个异步任务
napi_create_async_work(env, nullptr, resourceName, ExecuteWork, WorkComplete, callbackData,
&callbackData->work);
// 将异步任务加入到异步队列中
napi_queue_async_work(env, callbackData->work);
return nullptr;
}
2.在工作线程中调用ExecuteWork,并执行线程安全函数。
static void ExecuteWork(napi_env env, void *data)
{
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
std::promise<std::string> promise;
auto future = promise.get_future();
napi_call_threadsafe_function(callbackData->tsfn, &promise, napi_tsfn_nonblocking);
try {
auto result = future.get();