重用线程 - C ++

时间:2015-10-22 13:52:28

标签: c++ node.js multithreading threadpool v8

我正在制作和插件(到nodejs)。我所拥有的一项功能是负责使用到达的音频进行快速算法。我的目标是在一个线程中执行该算法。这是该功能的简历:

void buffering(const FunctionCallbackInfo<v8::Value>& args) {
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);

    int size = args[1]->NumberValue();
    int final_read = args[2]->NumberValue();
    int inicio_read = args[3]->NumberValue();
    int client_id = args[4]->NumberValue();

    Local<Object> bufferObj = args[0]->ToObject();

    buf = node::Buffer::Data(bufferObj);
    char mini_buf[80000];//char mini_buf[4096];
    memcpy(mini_buf, buf, size);
    //To implement a thread
    int teste_buf = Julius[client_id].Audio_Buffering(mini_buf, size, final_read, inicio_read, client_id);

    //(....returns to nodejs...)
}

如果Audio_Buffering只执行了一次,我可以这样做:

std::thread t[num__threads];
t[client_id] = std::thread(&SREngineJulius::Audio_Buffering, &Julius[client_id], mini_buf, size, final_read,inicio_read,client_id);

碰巧的是,只要音频到来(由于服务器中的事件),就会执行此功能。所以我的目标是将执行放在一个线程中。可能是一样的吗?如果不是,我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

您的调用在主线程中处理,因此阻止JS运行。你应该在一个额外的线程中完成工作,但这将从根本上改变你的功能现在的工作方式。

基本上这会将你的功能分为三个部分:

  1. 验证:将输入数据(参数,缓冲区数据)复制出V8结构并从堆栈中复制出来。您不能在工作线程中调用任何V8函数。由于您的函数现在将是异步的,因此您还需要至少传递一个回调函数。

  2. 工作:在工作线程中完成工作并将输出存储在某处。

  3. 解决:返回主线程,将输出导入V8结构并调用回调。

  4. 详细说明:

    1. 我不会解释你如何获取数据,似乎你解决了这个问题。你必须将它存储在V8和你当前的堆栈框架之外的某个地方,我建议使用std::make_shared创建一个结构,并在验证输入时填写。将回调存储为v8::Persistent<v8::Function>;您还需要存储隔离物。

    2. 以您喜欢的方式开始您的主题。是否使用线程池。不要使用std::async,因为您不能等待它。将指向您的数据的指针传递给它,然后让它完成工作。

    3. 从您的工作线程中,您需要返回主线程。您必须使用uv_async_send中的uv.h执行此操作(另请参阅uv_async_inituv_close)。在主线程中,在v8::HandleScope中,创建一个v8::Local<v8::Function>并将其调用。