Является ли pybind11 `py :: array` объект потокобезопасным? - PullRequest
0 голосов
/ 29 марта 2020

С библиотекой <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, и я беру заботиться об обновлении отдельных частей в каждой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...