在C ++线程中导入嵌入式python中的objc

时间:2012-01-30 15:35:31

标签: c++ python multithreading boost

我不熟悉在C ++应用程序中嵌入python。如果以前曾经问过这个问题,请原谅我,即使我通过网络搜索完成了我的作业。

所以,这是我的问题。 如果我在应用程序的主线程中运行嵌入式python代码,一切运行正常。但是如果我在子线程(由主线程创建)中运行嵌入式python代码,一些python导入将无法工作。

我在这里做了一个小程序来演示:

#include <iostream>
#include <boost/python.hpp>
#include <boost/thread.hpp>

using namespace boost::python;

int threadFunc ( ){
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();

    std::cout << "Py_GetProgramName: " << Py_GetProgramName() << std::endl;
    std::cout << "Py_GetPath: " << Py_GetPath() << std::endl;
    std::cout << "Py_GetExecPrefix: " << Py_GetExecPrefix() << std::endl;

    object main_module = boost::python::import ( "__main__");
    object main_namespace = main_module.attr("__dict__");

    object objc_import = boost::python::import ( "objc" );

    exec("a = 10\n", main_namespace);
    exec("print a\n", main_namespace);

    return 0;

}

int main( ){

    Py_InitializeEx( 0 ); // 

    PyEval_InitThreads();

    // Uncomment this will make the program work.
    //object objc_import = boost::python::import ( "objc" );

    PyEval_ReleaseLock();

    boost::thread * theChildThread = new boost::thread (threadFunc);

    while (1){
        boost::this_thread::sleep( boost::posix_time::seconds(1) );
    }
    delete theChildThread;

    Py_Finalize();
    return 0;
}

当我尝试在threadFunc

中导入objc时代码失败
object objc_import = boost::python::import ( "objc" );

通过实验不同的东西,我发现如果我在启动子线程之前在主线程中执行此操作,整个程序将起作用(请参阅main函数中的注释):

//Uncomment this will make the program work.
//object objc_import = boost::python::import ( "objc" );

我想知道那里发生了什么。反正有没有在主线程中导入objc,但仍然使子线程工作?

谢谢,

0 个答案:

没有答案