std::sync::Mutex::get_mut() 为何未被标记为 unsafe?
文档说明
返回底层数据的可变引用。
由于此调用以可变方式借用Mutex,因此无需实际执行锁定——可变借用可静态保证不存在任何锁。
问题核心在于无需锁定这一点。若Mutex未被(直接或间接)用于unsafe块中,不会有任何线程持有它的引用,也就无法对其操作。这意味着,要编译get_mut的调用,所有曾使用该Mutex的线程必须已执行完毕。新线程访问Mutex保护的数据也没问题,因为它会以类似获取语义的方式读取内存,通过get_mut对数据的变更对新线程可见。
但如果Mutex被用于unsafe块中,可能存在某些线程(如FFI场景)仍持有指向该Mutex的指针:这些线程可能仍持有锁并操作数据,或刚完成修改并解锁。前者显然属于未定义行为(UB),后者会引发竞态条件,同样是UB——调用get_mut的线程可能无法看到另一线程通过指针更新的最新数据状态。要让调用get_mut的线程看到最新变更,需遵循获取/释放语义,但get_mut并未执行任何获取操作。
get_mut本身实用,但它并非线程安全,因此应被标记为unsafe。
内容的提问来源于stack exchange,提问作者Anton Dyachenko
相关产品推荐
相关产品推荐

