C++ 节点cpp扩展线程

C++ 节点cpp扩展线程,c++,node.js,multithreading,v8,C++,Node.js,Multithreading,V8,大家 正在尝试为动态库编写我的第一个节点扩展(“/usr/local/lib/libkdriveExpress.so”) 此扩展应连接到设备并接收数据。在收到数据时,它应该从javascript回调函数。我发现了如何存储持久性函数,所以从cpp调用js函数不是问题 本示例中,我使用简单的C++函数,只是为了与JS/P>无关的问题 /// void test(const uint8_t *telegram, uint32_t telegram_len, void *user_data){

大家

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

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

本示例中,我使用简单的C++函数,只是为了与JS/P>无关的问题

/// 
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);
/// ...
}
但当我从扩展调用任何函数时,它都不起作用。在上面的代码中,我调用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_telegrame_回调函数的说明:

注册一个回调函数

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

所以,我想问题在于线程。 我是cpp扩展和cpp的新手,以前是用js编写的。所以,我想,我需要学习cpp中的线程如何工作,以及v8引擎如何处理它


如果您有任何建议,我们将不胜感激。

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

你说的“当我从扩展调用任何函数时,它都不工作”是什么意思?你是不是忘了发布不起作用的代码?另外,从js到cpp可能需要相当长的时间…看看js代码。首先,我调用kdrive.ap_open_ip()。它开始侦听事件,并且工作正常(“日志中的kdrive:event callback”)。然后我需要调用其他kdrive函数。在js代码中,我在setTimeout中调用kdrive.whoami()。此函数返回字符串,而不与动态库进行任何交互。但如果您在调用事件后查看日志,则回调不起作用。>>>whoami调用-我们调用了kdrive.whoami()11:42:47:525[kdrive.connector.ConnectorNotificationHandler]onSignal:System exception:无法锁定互斥锁-现在事件回调不起作用您发布的代码片段离我们很远。什么是
kdrive
ap
对象?谁拥有
test
callback中提供的数据?这个回调从哪里调用?也许你在C++的JS对象包装器中保留了一些<代码> kDub>代码>上下文,当它超出范围,被JS GC程序破坏,在不一致的状态下,动态库只是一个包含机器指令的数据,它不调用任何东西。如果执行了某个代码,则表示有某个执行线程在执行该代码。在您的情况下,至少有一个运行js事件循环的线程。如果独立调用
test
回调,则它可能正在另一个线程中运行。我猜你需要先了解如何使用这个没有节点的库。C++代码中的所有KDRESVEL**函数都是从动态库中调用的。我确实在cpp文件的开头有#include。js中的kdrive对象是由节点gyp生成的扩展:var kdrive=require('./build/Release/kdrive');在kdrive_ap_register_telegrame_callback(ap,&test,NULL,&key)中注册后,动态库调用测试回调;ap是整数值:var ap=kdrive.ap_create();kdrive.ap_open_ip(ap,“192.168.3.201”)
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