> On Dec 22, 2017, at 10:59 AM, Pierre Habouzit via swift-corelibs-dev > <swift-corelibs-dev@swift.org> wrote: > >> On Dec 21, 2017, at 10:57 AM, Geordie J via swift-corelibs-dev >> <swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>> wrote: >> >> Hi, >> >> We are having some issues with threading / dispatch queues this week. >> Basically I’m wondering why the following “async” code has the output it >> does: >> >> print(Thread.isMainThread) // true >> DispatchQueue.main.async { >> print(Thread.isMainThread) // false (???) >> } > > This is wrong. > >> >> Whereas this same code but with “sync" prints “true” “true”: >> >> print(Thread.isMainThread) // true >> DispatchQueue.main.sync { >> print(Thread.isMainThread) // true >> } > > This is expected, because dispatch_sync() on the main thread is... difficult.
actually it should deadlock, this is wrong ;) dispatch_sync() on the main queue like I said has weird semantics, and doing dispatch_sync() from the main thread onto the main queue is illegal. > >> >> This goes against what I thought I understood about Dispatch. Are there any >> threading guarantees made by DispatchQueue at all? Especially on the main >> queue. And if not, is there another construct we can use? >> >> The issue is that we’re on Android (where the threading situation is cloudy >> at best to begin with) and the JNI (Java-Native Interface) has specific >> requirements about which threads its methods are run on. Let alone our >> graphics rendering code. >> >> Basically, initialising and using the JNI in separate >> DispatchQueue.main.async blocks apparently does not end up on the same >> thread (and apparently neither of them are the main thread). I’m quite >> confused by this. >> >> Are there any resources or docs to get up to scratch with the internals of >> Dispatch a bit better? > > THe problem here is not Dispatch, it's how it's (mis-)ported to Android for > now. > > On other platforms, either you call dispatch_main() and there's no main > thread anymore, or from the main thread you are supposed to drain the Main > CFRunloop which in turn is integrated with dispatch (or rather the other way > around: dispatch is integrated with the main CFRunloop) and the main queue > acts as a source on the main CFRunloop. > > Last I heard, Android has not done that. I tried to explain this on > https://github.com/apple/swift-corelibs-libdispatch/pull/299 > <https://github.com/apple/swift-corelibs-libdispatch/pull/299> which atm is > still not resolved. > > -Pierre > _______________________________________________ > swift-corelibs-dev mailing list > swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org> > https://lists.swift.org/mailman/listinfo/swift-corelibs-dev > <https://lists.swift.org/mailman/listinfo/swift-corelibs-dev>
_______________________________________________ swift-corelibs-dev mailing list swift-corelibs-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-corelibs-dev