> On 13 Sep 2016, at 14:49, Quinn The Eskimo! via swift-users 
> <swift-users@swift.org> wrote:
> 
> 
> On 13 Sep 2016, at 05:03, Gerriet M. Denkmann via swift-users 
> <swift-users@swift.org> wrote:
> 
>> Or is the code fundamentally wrong …?
> 
> This one.
> 
> You’re accessing a mutable value (`bitfield`) from multiple threads.  Swift 
> does not support that, even in situations like this where you’re sure that 
> the items are preallocated and that the threads are accessing non-overlapping 
> values.
> 
> As to how you fix this, it kinda depends on your final use for the array.  If 
> you’re OK with the results being split into per-thread chunks, you can have 
> each thread work on its own chunk and then pass the results back to the 
> ‘main’ thread when it’s done.  OTOH, if you need your results in one big 
> array, things get tricky.

Stephen J. Butler just suggested a solution (on CocoaDev) which works and is 
fast and uses no additional memory.

Here it is:

let nbrOfThreads = 8
let step = 2
let itemsPerThread = number * step
let bitLimit = nbrOfThreads * itemsPerThread
var bitfield = [Bool](count: bitLimit, repeatedValue: false)

let queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 );

bitfield.withUnsafeMutableBufferPointer { (inout bitfieldBuffer : 
UnsafeMutableBufferPointer<Bool>) -> () in
    dispatch_apply( Int(nbrOfThreads), queue ) { ( idx: size_t) -> Void in
        let startIndex = itemsPerThread * Int(idx)
        let endIndex = min( startIndex + itemsPerThread, bitLimit )
        if talk { print("Thread[\(idx)] does \(startIndex) ..< \(endIndex)") }

        var currIndex = startIndex
        while( currIndex < endIndex )
        {
            bitfieldBuffer[currIndex] = true
            currIndex += step
        }
    }
}

I hope that this is really thread-safe (testing it, I have no problems so far).

Kind regards,

Gerriet.

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to