pybind11`py::array`对象线程安全吗



使用<thread>库,我用Python调用的C++编写了一段多线程代码,并使用了pybind11库。代码失败并抛出SIGSEGV错误,但是,我没有显式地编写任何共享资源。

在代码中,我使用两个py::array的对象,特别是以前存储在C++类中的py::array的两个视图。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对象中提取的指针,我会注意更新每个线程中的单独部分。

我不知道为什么,但不知道,对象的数组族显然不是线程安全的。

当我使用pybind11数组和openMP时,我总是提取数据指针(使用data((和mutableData((函数(,形状和跨步离开平行区域,并在平行区域内使用数据指针。

最新更新