[swift-users] Bool type and reading and writing operation atomicity

Zhao Xin owenzx at gmail.com
Thu Jan 19 20:59:20 CST 2017


You can use the GCD semaphore.
https://developer.apple.com/reference/dispatch/dispatchsemaphore

Or it is always better to consider of using queues if you can.

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/uid/TP40008091-CH105-SW1

Zhaoxin

On Wed, Jan 18, 2017 at 5:53 PM, Dale Myers via swift-users <
swift-users at swift.org> wrote:

> Compiler optimisations are something I completely ignored in my reasoning,
> which as has been pointed out was clearly a mistake.
>
> We will switch to using something that provides atomic operations.
>
> Thanks!
>
> -----Original Message-----
> From: johannesweiss at apple.com [mailto:johannesweiss at apple.com]
> Sent: 17 January 2017 18:37
> To: Dale Myers <dalemy at microsoft.com>
> Cc: swift-users at swift.org
> Subject: Re: [swift-users] Bool type and reading and writing operation
> atomicity
>
> Hi,
>
> > Put simply, are reading and writing to Bools both atomic operations in
> Swift (3)?
>
> you don't get a guarantee for that as Swift at the moment lacks both, a
> memory and a concurrency model.
>
>
> > Obviously, something reading and then assigning assuming the value
> doesn't change between is not correct, but would something like the
> following be fine:
> >
> >    var myBool = false
> >
> >    // Thread 1
> >    while true {
> >        if randomEvent() {
> >            myBool = true
> >        }
> >    }
> >
> >    // Thread 2
> >    while true {
> >        if myBool {
> >            print("Was set to true")
> >        } else {
> >            print("Not set")
> >        }
> >    }
> >
> >
> > I understand that in thread 2, the value of myBool can change between
> the check and the print statements, but that's fine. What I want to confirm
> for my team is that `myBool` can never be in some weird "third" state?
>
> As far as I know, you don't get a guarantee for that. But worse (and just
> like in C/C++/...) you most importantly don't get the guarantee that Thread
> 2 will ever see the change of Thread 1. The compiler could also optimise
> the code in Thread 2 to
>
> while true {
>    // if false {
>    //     print("Was set to true")
>    // } else {
>           print("Not set")
>    // }
> }
>
> ie. the compiler could 'prove' that `myBool` is never written (legally)
> and therefore delete all the code that assumes myBool != false.
>
> I'm not saying the compiler is doing this today but AFAIK it could do so
> if it wanted.
>
>
> > From what I can tell, behind the scenes, Bool uses a Builtin.Int1 for
> storage. I can't find the definition for this type anywhere so I can't
> check what it is really doing. My assumption is that it uses something like
> a C++ unsigned char behind the scenes, which would be fine with the above
> code on x86 and ARM as far as I'm aware.
>
> In C/C++ you'd need the new _Atomic variables to get that guarantee.
>
>
> > [...]
>
> Again, I'm not saying the compiler does do that but AFAIK it could do so
> legally. But one of the compiler people can answer these questions much
> better than I can.
>
> Cheers,
>   Johannes
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170120/9ba906ce/attachment.html>


More information about the swift-users mailing list