ほとんどの場合nbind - GitHub linkを使用し、非同期コールバックコールの場合はNan - GitHub linkを使用してC++アドオンを作成しています。コールバックを1回だけ呼び出すと、完璧に機能します。しかし、コールバックを2回呼び出すと、Segmentation fault (core dumped)
となります。 gdb
を使用してエラーが見つかりませんでした。ここでJSとC++コード(node-gyp configure build
を使用してコンパイルする)は、次のとおりです。コールバック関数を2回呼び出すと、セグメンテーションフォールトが発生します.NN
//main.js code
var nbind = require('nbind');
var lib = nbind.init().lib;
lib.HeaderExample.callJS(function(a) {
console.log("result" + a);
});
lib.HeaderExample.startThread();
lib.HeaderExample.startThread();
C++アドオンのコード
//c++ code
class CallbackRunner : public Nan::AsyncWorker {
public:
CallbackRunner(Nan::Callback *callback)
: AsyncWorker(callback) {}
void Execute() {}
void HandleOKCallback() {
std::cout << "running HandleOKCallback in thread " << std::this_thread::get_id() << std::endl;
Nan::HandleScope scope;
v8::Local<v8::Value> argv[] = {
Nan::New<v8::Number>(10)
};
callback->Call(1, argv);
}
};
class HeaderExample {
public:
static void callJS(nbind::cbFunction &callback) {
std::cout << "running callJS in thread " << std::this_thread::get_id() << std::endl;
m_onInitialisationStarted = new nbind::cbFunction(callback);
Nan::Callback *callbackNan = new Nan::Callback(m_onInitialisationStarted->getJsFunction());
runner = new CallbackRunner(callbackNan);
}
static void startThread() {
std::cout << "it is here";
std::thread threadS(some);
threadS.join();
}
static void some() {
std::cout << "running some in thread: " << std::this_thread::get_id() << std::endl;
if(runner){
AsyncQueueWorker(runner);
}
}
inline static nbind::cbFunction *m_onInitialisationStarted = 0;
inline static CallbackRunner *runner;
};
こんにちはにNANに追加されました!私はロッカーを追加する必要がありますか? –
はい、ロッカーはこれを達成するための1つの方法です。 (もう1つの質問は、複数のスレッドを持つことがあなたのユースケースに役立つかどうか、あるいはこれらすべてのスレッドがV8に独自のコールバックを実行するかどうかです。これ以上の詳細は提供していないので、 ) – jmrk
アドバイスありがとうございました:)この例は、私の実際のプログラムのシミュレーションです。実行中にJavaScriptで呼び出される必要があるのは、独自のスレッド内の( 'in C++')コールコールバックです。明確化のためにどのような詳細が必要でしょうか?私はそれを共有することを喜んでします;) –