Swift中任务为何始终按序执行?预期不一致却总是输出1,2
为什么这段无锁代码总能输出1,2?
你看到的“总是输出1,2”其实是任务太简单导致的巧合,并不是真的没有线程安全问题,原因如下:
任务执行速度太快:
increment()里的count +=1是个极快的操作,两个任务还没来得及真正并发执行,第一个就已经跑完了。系统调度线程需要一定开销,这点时间足够第一个任务完成自增和打印,第二个任务才开始执行,自然不会出现竞争。Task调度的特性:不管是
Task.detached还是普通Task,Swift的并发调度器会根据系统资源分配线程,但对于这种超轻量任务,调度器可能会按提交顺序依次执行;就算分配了不同线程,也因为操作太快没产生执行交错。没制造足够的并发压力:如果想重现竞态条件,你可以给
increment()加个微小延迟,或者让任务循环多次调用,比如:func increment() -> Int { // 加个小延迟,让任务有机会并发执行 Thread.sleep(forTimeInterval: 0.001) count += 1 return count }这样就能看到输出出现重复、乱序的情况,比如出现2,2或者1,1的结果,这才是线程不安全的真实表现。
总结一下:你的代码只是刚好没触发竞态条件,不代表它是线程安全的。真正的线程安全问题需要在任务有足够并发重叠的时候才会显现。
内容的提问来源于stack exchange,提问作者WishIHadThreeGuns
相关产品推荐
相关产品推荐

