队列积累与非阻塞机制
- NonBlockingCall 的工作原理
napi_status status = g_tsfnSyncCaptureGuard.NonBlockingCall(
new SyncRequest{preventCapture},
[](Napi::Env env, Napi::Function jsCallback, SyncRequest* request) {
syncCaptureGuard(request->preventCapture);
delete request;
});
- 关键理解-非阻塞 (NonBlocking)
- NonBlockingCall 立即返回,不等待主线程执行
- 调用者(守护线程)继续执行,不会停下来等待结果
- 这就是"不阻塞守护线程"的含义
- 队列积累 (Queue Accumulation)
时间线示例:
t=0ms: 守护线程: syncCaptureGuardOnMainThread(true) → 请求1入队
主线程: 正在处理 HTTP 请求...
t=100ms: 守护线程: syncCaptureGuardOnMainThread(true) → 请求2入队
主线程: 还在处理 HTTP 请求...
t=200ms: 守护线程: syncCaptureGuardOnMainThread(true) → 请求3入队
主线程: 还在处理 HTTP 请求...
t=250ms: 主线程: HTTP 请求完成,开始处理队列
→ 执行请求1 → syncCaptureGuard(true)
→ 执行请求2 → syncCaptureGuard(true)
→ 执行请求3 → syncCaptureGuard(true)
- 对比:BlockingCall vs NonBlockingCall
// BlockingCall(阻塞)
g_tsfn.BlockingCall(...);
// ↑ 守护线程在这里停住,等待主线程执行完成
// ↓ 主线程执行完成后,守护线程才继续
// NonBlockingCall(非阻塞)
g_tsfn.NonBlockingCall(...);
// ↑ 守护线程立即继续,不等待
std::this_thread::sleep_for(kPollInterval); // 立即执行下一行