用并发for循环填充结构数组会导致malloc错误

时间:2018-11-17 11:11:28

标签: swift struct concurrency

在SceneKit场景中,我想从文本文件中加载对象的顶点。之后,我从这些顶点创建SCNGeometry。

要存储位置和颜色信息,我创建了一个名为Vertex的结构:

struct Vertex {
    var x: Float, y: Float, z: Float
}

工作示例

使用线程读取数据并将其存储在vertices数组中时,一切工作正常:

// read file as lines of string
var n = totalNumberOfVertices
var lines = data.components(separatedBy: "\n")

// create array for vertices
var vertices = Array(repeating: Vertex(x:0, y:0, z:0), count: n)

// fill vertices array
for i in 0...(n-1) {
    let elements = lines[i].components(separatedBy: " ")

    vertices[i].x = Float(elements[0])!
    vertices[i].y = Float(elements[1])!
    vertices[i].z = Float(elements[2])!
}

// create geometry and so on ...

问题

为了提高性能,我想使用 GDS 执行并发for循环。因为所有行都在那里,所以我只需要不同的行索引,即可将数据存储在不同的数组索引中。因此应该可以轻松地将其并行化:

// fill vertices array concurrent
DispatchQueue.concurrentPerform(iterations: n - 1) { (i) in
    let elements = lines[i].components(separatedBy: " ")

    vertices[i].x = Float(elements[0])!
    vertices[i].y = Float(elements[1])!
    vertices[i].z = Float(elements[2])!
}

但是现在在设置不同的顶点值(x, y, z)时总是会出错。该错误告诉我没有释放指针,但是我看不到他在谈论哪种指针。也许我误解了Swift中结构的底层实现。

malloc: *** error for object 0x113190000: pointer being freed was not allocated

有人可以告诉我我在做什么错,因为我不经常写Swift,但是我相信我没有任何可见的(直接在我的代码中)并发问题。

其他

另一个奇怪的事情是:如果获得对struct元素的引用,则无法设置值。结构是否总是返回byval?也许与这种现象有关。

var vertex = vertices[i]

// this is not working
// vertices[i] is still 0 after that
vertex.x = Float(elements[0])!
vertex.y = Float(elements[1])!
vertex.z = Float(elements[2])!

0 个答案:

没有答案