在多线程中使用Boost.Python
看起来boost::python和boost::thread之间的关系不太好,至少从我了解到的情况来看是这样的。
请参考这个链接:http://pastebin.com/Cy123mJK
这是我在使用boost::python和boost::thread的应用程序中遇到问题的简化描述。
如果有人能告诉我为什么会出现这些问题,我就太感激了,因为我一直确保每次只有一个线程在和Python进行交互。
在某个时刻,程序会因为一个不明显的原因崩溃,出现了段错误(segfault)。而且,看起来也无法捕捉到这个崩溃...
非常感谢大家的帮助!
1 个回答
7
你在同时运行多个线程的 Python 代码,分别在 Producer::run()
和 Consumer::run()
里。
具体来说,你在锁定互斥量(mutex)之前就运行了这个代码:
boost::python::object writer = this->k->Get<boost::python::object>("write");
也许你没有意识到,当你在 Keeper::Get
中调用 boost::python::object::operator[](const std::string&)
时,Boost 最终会调用 PyObject_GetItem
。你需要把这个 Get 调用移动到正确的位置,也就是在锁定之后、使用返回的函数之前:
{
boost::mutex::scoped_lock l(this->k->python_keeper);
boost::python::object writer = this->k->Get<boost::python::object>("write");
writer(boost::python::str(os.str()));
}
编辑:去掉了 Py_Finalize()
。没错,你说得对,boost.python 不喜欢这个。