2014-11-29 3 views
0

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); 
+1

_ "스레드에서 콜백을 사용할 수 없습니다."_ - 우리는 독자가 아니므로 사용하지 못하는 이유 및/또는 무엇이 실패했는지 그리고 어디에 있는지 알려야합니다. –

+0

세그먼트 오류는 PostMessage 함수의 마지막 줄에서 발생합니다. – Anatoly

답변

2

등이 바로 메시지를 보낼 다른 스레드에서 uv_async을 사용하는 것입니다 할 수있는 유일한 방법 콜백 함수를 실행하는 메인 쓰레드에 전달한다. The tests for uv_async을 사용하면 도움이 될 수 있습니다.

+0

올바른 방향으로 나를 가르쳐 주셔서 감사합니다. libuv가 node.js 기본 루프를 사용할 수 있다는 것을 몰랐습니다. libuv에 대한이 소개는 정말로 도움이되었습니다. http://nikhilm.github.io/uvbook/basics.html – Anatoly

관련 문제