Вы запускаете python в нескольких потоках одновременно в Producer::run()
и Consumer::run()
.
Если быть точным, вы запускаете это перед блокировкой мьютекса:
boost::python::object writer = this->k->Get<boost::python::object>("write");
Возможно, вы не понимали, что Boost в конце концов вызывает PyObject_GetItem
, когда вы звоните boost::python::object::operator[](const std::string&)
в Keeper::Get
. Вам нужно переместить этот 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 это не нравится.