v8이 스레드로 액세스하는 함수에서 v8 :: Locker를 사용하는 한 v8이 멀티 스레딩을 지원한다는 것을 알고 있습니다.스레드에서 v8 핸들을 사용하면 실패합니다.
그러나 다음 샘플에 나는 스레드에서 콜백을 사용할 수 없습니다
static Persistent<v8::Function> cb;
void PostMessage(){
Isolate* isolate = Isolate::GetCurrent();
v8::Locker locker(isolate);
HandleScope scope(isolate);
const unsigned argc = 1;
Local<Value> argv[argc] = { String::NewFromUtf8(isolate, "test") };
Local<v8::Function> PostMessageCb = Local<v8::Function>::New(isolate, cb);
(PostMessageCb)->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}
void SetupCallback(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
v8::Locker locker(isolate);
HandleScope scope(isolate);
Local<v8::Function> local_cb = Local<v8::Function>::Cast(args[0]);
cb.Reset(isolate, local_cb);
}
void UseCallback(const FunctionCallbackInfo<Value>& args) {
//PostMessage(); <- that works
std::thread t(PostMessage); // <- that doesn't
t.join();
}
내가 잘못 V8 :: 로커를 사용하고?
편집 : 내 코드에 문제가 발생했습니다. 대신
(PostMessageCb)->Call(isolate->GetCurrentContext()->Global(), argc, argv);
가져 오기 생성 컨텍스트 :
내 금고 사용하려고 시도와 경험에서(PostMessageCb)->Call(PostMessageCb->CreationContext()->Global(), argc, argv);
_ "스레드에서 콜백을 사용할 수 없습니다."_ - 우리는 독자가 아니므로 사용하지 못하는 이유 및/또는 무엇이 실패했는지 그리고 어디에 있는지 알려야합니다. –
세그먼트 오류는 PostMessage 함수의 마지막 줄에서 발생합니다. – Anatoly