pthread не видит переменную экземпляра, переданную в качестве аргумента

У меня есть класс в C ++, который использует Boost Python. Я пытаюсь запустить код Python в потоке из C ++, используя pthread. Проблема в том, что приведенный ниже код не производит никакого вывода. Я ожидал выхода 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();
}

Спасибо.

0

Решение

Проблема в:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]