Параллельный поиск с помощью dispatch_async

Я пытаюсь реализовать алгоритм параллельного поиска. Концепция примерно такая:

  1. Начните с кандидата и проверьте, является ли это желаемым значением
  2. Если нет, создайте больше кандидатов и добавьте их в очередь.
  3. Повторяйте до достижения желаемого значения

В качестве упрощенного примера: я хочу запустить генератор случайных чисел в диапазоне 0..<n, пока он не даст мне 0. Я хочу уменьшать n с каждой итерацией, чтобы гарантировать успех. Это мой код до сих пор:

let queue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)
let work : dispatch_function_t = { arg in
    let upper = UnsafeMutablePointer<UInt32>(arg).memory
    let random = arc4random_uniform(upper)
    if random == 0 {
        // do things
    } else {
        dispatch_async_f(queue, &(upper - 1), work)
        // Error: Variable used within its own initial value
    }
}

dispatch_async_f(queue, &1000, work)
// Error: '&' used for non inout argument of type 'UnsafeMutablePointer<Void>'

У меня две ошибки:

Variable used within its own initial value
'&' used for noninout argument of type 'UnsafeMutablePointer<Void>'

Как я могу их исправить? Спасибо заранее!


person Jenny    schedule 01.11.2015    source источник


Ответы (1)


Вы можете исправить «используется в пределах своего собственного начального значения», выполнив объявление и инициализацию в два этапа.

let work: dispatch_function_t
work  = { arg in
    let upper = UnsafeMutablePointer<UInt32>(arg).memory
    let random = arc4random_uniform(upper)
    if random == 0 {
        // do things
    } else {
        dispatch_async_f(queue, &(upper - 1), work)
        // Error: Variable used within its own initial value
    }
}

Вы можете исправить другой, как это.

var n = 1000
dispatch_async_f(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), &n, work)
person Chris Gulley    schedule 01.11.2015
comment
Такое простое решение! Большое спасибо! - person Jenny; 01.11.2015