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") }
预期执行流程
修正后,程序会按照你的预期运行:
task1获取读锁,执行2秒后释放读锁,打印task1 done并标记等待组完成。task2等待1秒后尝试获取写锁,此时task1仍持有读锁,因此task2会阻塞等待。task1释放读锁后,task2立即获取写锁,执行1秒后释放,打印task2 done并标记等待组完成。- 主协程等待两个任务完成后退出。
额外说明
Odin的sync.Atomic_RW_Mutex实现了写优先的逻辑:当有写锁等待时,新的读锁请求会被阻塞,直到写锁获取并释放,避免写锁出现饥饿问题。
内容的提问来源于stack exchange,提问作者Caleb Manning
相关产品推荐
相关产品推荐

