Node cpp扩展线程

时间:2017-06-09 09:07:47

标签: c++ node.js multithreading v8

大家

尝试编写动态库的第一个节点扩展(“/usr/local/lib/libkdriveExpress.so”)

此扩展程序应连接到设备并接收数据。在收到数据时,它应该从javascript回调函数。我已经找到了如何存储持久性函数,因此从cpp调用js函数不是问题。

在这个例子中,我使用简单的c ++函数,除了js

的问题
/// 
void test(const uint8_t *telegram, uint32_t telegram_len, void *user_data){
    kdrive_logger_ex(KDRIVE_LOGGER_ERROR, "kdrive: event callback");
};
void ap_open_ip(const FunctionCallbackInfo <Value> &args) {
/// ...
/// now register
    kdrive_ap_register_telegram_callback(ap, &test, NULL, &key);
/// ...
}

当我从js调用它时它工作正常。

if (kdrive.ap_open_ip(ap, "192.168.3.201") == 0) {
    console.log("great success", ap);
    setTimeout(function () {
        console.log(kdrive.whoami());
   }, 2000)
}

但是当我从扩展程序调用任何函数时它不起作用。在上面的代码中,我调用whoami函数,它不使用动态库,只返回字符串。

这是日志:

great success 1
11:42:45:518 [kdrive.express] kdrive: event callback
11:42:45:590 [kdrive.express] kdrive: event callback
11:42:45:692 [kdrive.express] kdrive: event callback
11:42:45:735 [kdrive.express] kdrive: event callback
11:42:45:831 [kdrive.express] kdrive: event callback
11:42:45:900 [kdrive.express] kdrive: event callback
11:42:46:167 [kdrive.express] kdrive: event callback
11:42:46:717 [kdrive.express] kdrive: event callback
>>> whoami call
11:42:47:525 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex
11:42:48:067 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex
11:42:48:420 [kdrive.connector.ConnectorNotificationHandler] onSignal: System exception: cannot lock mutex

以下是kdrive_ap_register_telegram_callback函数的说明:

  

注册回调函数。

     

收到电报时将调用此回调函数   访问端口。内部使用通知线程,因此   回调将在通知线程的上下文中(而不是   主线程)。也就是说,在呼叫时应该小心   回调。此函数生成一个唯一键来表示   打回来。此密钥可用于稍后删除回调   状态。

所以,我猜问题是线程。 我是cpp扩展和cpp的新手,之前在js写过。所以,我想,我需要了解cpp中的线程如何工作以及v8引擎如何处理它。

非常感谢任何建议和建议。

1 个答案:

答案 0 :(得分:0)

问题与线程无关。这是因为js gc破坏了kdrive对象。