You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:32:48