С библиотекой <thread>
я написал многопоточный код на C ++, который вызывается Python, и я использовал библиотеку pybind11
. Код завершается ошибкой и выдает SIGSEGV
ошибок, однако я не пишу явно ни одного общего ресурса.
Внутри кода я использую оба объекта py::array
s, в частности, два представления py::array
ранее сохраненный в классе C ++. py::array
сохраняет ссылку на объект handle
, который не выполняет подсчет ссылок, поэтому я думаю, что с ним можно безопасно работать в нескольких потоках. Я прав?
Ниже приведен простой пример, чтобы лучше прояснить ситуацию:
MyClass::MyClass(py::array ar) {
/* perform a reshape of ar */
this->ar = ar;
}
MyClass::MyMethod() {
py::gil_scoped_release release;
/* create threads*/
/* for each thread, compute two views of ar, ar1 and ar2*/
/* compute a double using ar1 and ar2 */
/* use double to update another structure (not py::array)*/
/* join threads*/
py::gil_scoped_acquire acquire;
return
}
Наконец, обратите внимание, что структура, которую я обновляю, является просто указателем, извлеченным из объекта py::buffer_info
, и я беру заботиться об обновлении отдельных частей в каждой теме.