我在C ++中有一个使用boost python的类。我正在尝试使用pthread在C ++的线程中运行python代码。问题在于下面的代码没有产生任何输出。我期待在stdout中输出John DOE。看来&this->instance没有携带在对象内部设置的值。如何将当前对象或其实例变量传递给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();
}


谢谢。

最佳答案

问题是:

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.
}

关于c++ - pthread看不到实例变量作为参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40617279/

10-12 20:43