2016-11-15 8 views
0

私はboost pythonを使用するC++のクラスを持っています。私はpthreadを使ってC++からのスレッドでPythonコードを実行しようとしています。問題は、以下のコードが出力を生成していないことです。私はstdoutの出力John DOEを期待していました。 &this->instanceは、オブジェクト内で設定されている値を保持していないようです。どのようにpthreadが渡されているのを見ることができるように、現在のオブジェクトまたはそのインスタンス変数をpthread_createに渡すことができますか?pthreadには引数として渡されるインスタンス変数がありません

Python:

class A: 
    def __init__(self, name): 
     self.name = name 

    def printName(self, lastName): 
     print self.name + " " + lastName 

C++:

#include <boost/python.hpp> 
#include <string.h> 
#include <pthread.h> 

using namespace std; 
using namespace boost::python; 

class B { 
    public: 
     object instance; 
     B(); 
     void setupPython(); 
     static void *runPython(void *); 
}; 

B::B() { 
    Py_Initialize(); 
} 

void B::setupPython() { 
    pthread_t t1; 
    try { 
     object a = import("A"); 
     instance = a.attr("A")("John"); 
     pthread_create(&t1, NULL, runPython, &this->instance); // THIS IS PROBLEM 
    } 
    catch(error_already_set const &) { 
     PyErr_Print(); 
    } 
} 

void *B::runPython(void *instance) { 
    ((object *)instance)->attr("printName")("DOE"); 
} 

int main() { 
    B b; 
    b.setupPython(); 
} 

ありがとうございます。

答えて

1

問題がある:

int main() { 
    B b; 
    b.setupPython(); // You create a thread here 
    // But here, b is destroyed when it's scope ends 
} 

bが解放される前に、スレッド内のコードの実行が保証されていません。

ヒープ上にBを割り当ててみて、それが動作するかどうかを確認:

int main() { 
    B* b = new B(); 
    b->setupPython(); 
    // also, you should add a call to pthread_join 
    // here to wait for your thread to finish execution. 
    // For example, changing setupPython() to return the 
    // pthread_t handle it creates, and calling pthread_join on it. 
} 
+0

*ヒープ上にBを割り当ててみて、それが動作するかどうかを確認:*おそらくまだ動作しません - とき 'メイン()'を返します、プログラムは終了する。 –

+0

@AndrewHenle正しい答えを編集しました。 – Steeve

+0

@Steeve答えをありがとう。できます。 – pseudo

関連する問題