Tôi có một mảng lớn mà tôi muốn xử lý bằng cách giao lát của nó cho một vài nhiệm vụ không đồng bộ. Như một bằng chứng của khái niệm, tôi đã viết các đoạn mã sau:Xử lý mảng song song bằng cách sử dụng GCD
class TestParallelArrayProcessing {
let array: [Int]
var summary: [Int]
init() {
array = Array<Int>(count: 500000, repeatedValue: 0)
for i in 0 ..< 500000 {
array[i] = Int(arc4random_uniform(10))
}
summary = Array<Int>(count: 10, repeatedValue: 0)
}
func calcSummary() {
let group = dispatch_group_create()
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
for i in 0 ..< 10 {
dispatch_group_async(group, queue, {
let base = i * 50000
for x in base ..< base + 50000 {
self.summary[i] += self.array[x]
}
})
}
dispatch_group_notify(group, queue, {
println(self.summary)
})
}
}
Sau init()
, array
sẽ được khởi tạo với số nguyên ngẫu nhiên giữa 0 và 9.
Chức năng calcSummary
công văn 10 công việc mà mất khối rời nhau trong số 50000 mục từ array
và thêm chúng lên, sử dụng vị trí tương ứng của chúng trong summary
làm trình bổ sung.
Chương trình này gặp sự cố tại đường dây self.summary[i] += self.array[x]
. Lỗi này là:
EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP).
tôi có thể thấy, trong trình gỡ lỗi, rằng nó đã cố gắng lặp một vài lần trước khi đâm, và rằng các biến, tại thời điểm vụ tai nạn, có giá trị trong phạm vi giới hạn chính xác.
Tôi đã đọc rằng EXC_I386_INVOP
có thể xảy ra khi cố gắng truy cập một đối tượng đã được phát hành. Tôi tự hỏi liệu điều này có liên quan gì đến Swift khi tạo một bản sao của mảng nếu nó được sửa đổi, và nếu có thì làm thế nào để tránh nó.
Cảm ơn. Tôi tự hỏi nếu điều này thực sự hoạt động, hoặc nếu nó là do cơ hội bởi vì chỉ có mười bài tập (mã ban đầu của tôi có thể lặp lại một vài lần trước khi bị rơi). Tôi sẽ thử với một mảng 'tóm tắt' lớn hơn và xem điều gì xảy ra. – Eduardo
Thú vị ... dựa trên mã của bạn, tôi đã tăng các tác vụ lên 100 và nó vẫn hoạt động. Vấn đề của tôi là mã tôi đăng là đơn giản hóa những gì tôi cần, và, trong cuộc sống thực, tôi thực sự cần phải tích lũy trên 'tóm tắt'. Tôi sẽ cố gắng giải quyết nó bằng văn bản cho bộ nhớ trực tiếp. – Eduardo
Làm việc trực tiếp với bộ nhớ 'tóm tắt' để giải quyết vấn đề. Tôi thực sự nhớ là có thể vượt qua mảng bằng cách tham khảo! – Eduardo