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

Odin语言Atomic_RW_Mutex出现意外死锁问题咨询

问题分析与解决

你的代码出现死锁的原因是错误使用了读写锁的写锁API,并非Atomic_RW_Mutex的预期行为或bug。

核心问题

Odin标准库中,sync.Atomic_RW_Mutex的写锁操作需要使用专门的sync.exclusive_lock和sync.exclusive_unlock函数,而你在task2中错误调用了针对普通sync.Mutex的sync.lock和sync.unlock函数。这两个函数的操作对象结构完全不同,错误调用会导致锁状态混乱,最终引发死锁。

修正后的代码

将task2中的锁操作替换为读写锁的专属写锁API:

task2 :: proc(t: ^thread.Thread)
{
    time.sleep(time.Second * time.Duration(1))

    fmt.println("before lock")
    sync.exclusive_lock(&rw_mutex)  // 替换为读写锁的写锁函数
    fmt.println("after lock")
    time.sleep(time.Second * time.Duration(1))
    sync.exclusive_unlock(&rw_mutex)  // 替换为读写锁的写锁解锁函数

    sync.wait_group_done((cast(^sync.Wait_Group)t.data))

    fmt.println("task2 done")
}

预期执行流程

修正后,程序会按照你的预期运行:

  1. task1获取读锁,执行2秒后释放读锁,打印task1 done并标记等待组完成。
  2. task2等待1秒后尝试获取写锁,此时task1仍持有读锁,因此task2会阻塞等待。
  3. task1释放读锁后,task2立即获取写锁,执行1秒后释放,打印task2 done并标记等待组完成。
  4. 主协程等待两个任务完成后退出。

额外说明

Odin的sync.Atomic_RW_Mutex实现了写优先的逻辑:当有写锁等待时,新的读锁请求会被阻塞,直到写锁获取并释放,避免写锁出现饥饿问题。

内容的提问来源于stack exchange,提问作者Caleb Manning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:06:01