> On 13 Sep 2016, at 14:49, Quinn The Eskimo! via swift-users
> <[email protected]> wrote:
>
>
> On 13 Sep 2016, at 05:03, Gerriet M. Denkmann via swift-users
> <[email protected]> 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
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users