Avatar
actor-isolated な context を引き継ぐ条件がよくわからなくなってきました・・・。 @MainActor な API で↓を実行したときに、 print("#0", Thread.current, Thread.current == Thread.main) Task { print("#1a", Thread.current, Thread.current == Thread.main) Task { print("#1b", Thread.current, Thread.current == Thread.main) } } task { print("#2a", Thread.current, Thread.current == Thread.main) Task { print("#2b", Thread.current, Thread.current == Thread.main) } } Task.detached { print("#3a", Thread.current, Thread.current == Thread.main) Task { print("#3b", Thread.current, Thread.current == Thread.main) } } taskDetached { print("#4a", Thread.current, Thread.current == Thread.main) Task { print("#4b", Thread.current, Thread.current == Thread.main) } } DispatchQueue.main.async { print("#5a", Thread.current, Thread.current == Thread.main) Task { print("#5b", Thread.current, Thread.current == Thread.main) } } dispatchQueueMainAsync { print("#6a", Thread.current, Thread.current == Thread.main) Task { print("#6b", Thread.current, Thread.current == Thread.main) } } DispatchQueue.global().async { print("#7a", Thread.current, Thread.current == Thread.main) Task { print("#7b", Thread.current, Thread.current == Thread.main) } } dispatchQueueGlobalAsync { print("#8a", Thread.current, Thread.current == Thread.main) Task { print("#8b", Thread.current, Thread.current == Thread.main) } }
2:23 PM
(なお、 task などはそれとペアにある Task { } などをただラップしただけの関数です。)
2:23 PM
結果は↓のようになりました。 #0 <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #1a <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #1b <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #2a <NSThread: 0x6000035eac00>{number = 6, name = (null)} false #2b <NSThread: 0x6000035eac00>{number = 6, name = (null)} false #3a <NSThread: 0x6000035f6500>{number = 4, name = (null)} false #3b <NSThread: 0x6000035f6500>{number = 4, name = (null)} false #4a <NSThread: 0x6000035fc4c0>{number = 5, name = (null)} false #4b <NSThread: 0x6000035fc4c0>{number = 5, name = (null)} false #5a <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #5b <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #6a <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #6b <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #7a <NSThread: 0x600003571780>{number = 8, name = (null)} false #7b <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true #8a <NSThread: 0x6000035b2440>{number = 3, name = (null)} false #8b <_NSMainThread: 0x6000035f4000>{number = 1, name = main} true
2:24 PM
1b, 5b, 6b, 7b, 8b のみ context が引き継がれている。
2:25 PM
1b が OK なのに 2b は context が引き継がれず、にも関わらず 8b は引き継がれているのとか謎じゃないでしょうか。
👀 1