函数线程安全在参数层面的定义?调用方与被调用方责任如何划分?
线程安全的理解与参数层面的责任边界问题
我对线程安全的现有理解
- 若某个函数(包括其自身)可在其他线程中并发执行且无意外交互,则该函数是线程安全的
- 若某个类型不直接暴露内部实现,且其公共接口的所有函数均为线程安全,则该类型是线程安全的
核心概括
- 逻辑需考虑其他线程的存在
- 线程安全函数必须假设所有信息随时可能失效,除非采取措施确保其有效性
- 线程安全类型的接口应避免存在可能在用户检查后、调用函数前失效的前置条件
- 线程安全函数对任何成员/静态/全局变量的访问,要么是只读(若变量不可变),要么受保护(例如通过mutex)
遇到的困惑场景
遇到如下形式的函数:
template <typename IteratorType> void performSomeOperationOnARange(IteratorType const& itBegin, IteratorType const& itEnd);
- 该函数不访问任何成员/静态/全局变量,我倾向于认为它是线程安全的
- 但在同一范围上并发执行该函数肯定会导致意外交互,这又让我觉得它不安全
- 不过,要求该函数保护它一无所知的数据的访问权限似乎并不合理
- 将此扩展为原则:保护函数参数的访问权限应由调用方而非被调用方负责
- 但这一原则似乎过于宽泛。
this是传递给每个非静态成员函数的隐式参数,此时确保成员变量的访问安全无疑是被调用方的责任
提出的问题
函数的线程安全在参数层面意味着什么?调用方与被调用方的责任边界如何划分?
内容的提问来源于stack exchange,提问作者Eternal
相关产品推荐
相关产品推荐

