在多线程中使用Boost.Python

4 投票
1 回答
1643 浏览
提问于 2025-04-16 09:55

看起来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 不喜欢这个。

撰写回答