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

2024-05-18 10:08:51 发布

您现在位置:Python中文网/ 问答频道 /正文

使用^ {CD1>}库,我编写了一个多线程的C++代码,它由Python调用,并且我使用了^ {CD2>}库。代码失败并抛出SIGSEGV错误,但是,我没有显式地编写任何共享资源

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


Tags: andof对象代码pyreleasemyclass线程
1条回答
网友
1楼 · 发布于 2024-05-18 10:08:51

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

当我使用pybind11阵列和openMP时,我总是提取数据指针( 使用data()和mutableData()函数),形状和形状会跨出平行区域,并在平行区域内使用数据指针

相关问题 更多 >