静态自由函数线程安全吗?
Are static free functions thread safe?
我正在编写一个多线程程序,并且有一个函数将从多个线程调用,该函数是 cpp 文件中的静态自由函数。永远不会从 cpp 文件外部调用此函数,因此我想将其设为静态,以便它具有内部链接。
谷歌搜索我发现很多人说“静态函数不是线程安全的”,但是当我去阅读它时,每个人似乎都在谈论静态成员函数,而不是静态自由函数。
静态自由函数是否线程安全(假设它们不访问线程之间的任何共享状态)?
任何不访问共享状态的函数本质上都是线程安全的。只有在 read/writes 未受保护的共享状态时,才会发生数据竞争。如果没有共享状态,就无法进行数据竞争。
这就是为什么纯函数式语言自然是线程安全的。如果一个函数没有副作用,那么你可以在任意多个线程中调用它。
静态函数与其他函数相同。不是函数,而是函数的作用。
我认为有些人混淆了术语。静态函数 vs 带静态变量的函数。
虽然静态函数可能安全也可能不安全,但如果没有同步,带有静态变量的函数是不安全的。
此类函数的一个示例是 strtok
,它在静态变量中保留了延续点。当多个线程使用旧的 strtok
时,可能会导致输入之间的混合。
我正在编写一个多线程程序,并且有一个函数将从多个线程调用,该函数是 cpp 文件中的静态自由函数。永远不会从 cpp 文件外部调用此函数,因此我想将其设为静态,以便它具有内部链接。
谷歌搜索我发现很多人说“静态函数不是线程安全的”,但是当我去阅读它时,每个人似乎都在谈论静态成员函数,而不是静态自由函数。
静态自由函数是否线程安全(假设它们不访问线程之间的任何共享状态)?
任何不访问共享状态的函数本质上都是线程安全的。只有在 read/writes 未受保护的共享状态时,才会发生数据竞争。如果没有共享状态,就无法进行数据竞争。
这就是为什么纯函数式语言自然是线程安全的。如果一个函数没有副作用,那么你可以在任意多个线程中调用它。
静态函数与其他函数相同。不是函数,而是函数的作用。
我认为有些人混淆了术语。静态函数 vs 带静态变量的函数。
虽然静态函数可能安全也可能不安全,但如果没有同步,带有静态变量的函数是不安全的。
此类函数的一个示例是 strtok
,它在静态变量中保留了延续点。当多个线程使用旧的 strtok
时,可能会导致输入之间的混合。