共享库中应该避免使用静态成员函数吗?

6
在阅读Oliveira和Stewart的书籍《编写科学软件》时,我发现了这个有趣的段落:
“共享变量很危险,在共享库中应该避免使用静态或保存的局部变量以及全局变量。”
(第55页)
但是,静态成员函数呢?在共享库中,它们是否同样危险?我也应该避免使用它们吗?为什么/为什么不?

3
作者给出的理由是代码不可重入;也就是说,如果多个应用程序运行相同的DLL,共享静态/全局变量会带来风险。 - user1628622
1
关于静态成员/变量和共享,这些在共享库中的一个用例是全局事件和线程ID。这可以很容易地导致线程安全。其他静态成员通常最好放置在相关头文件中,放在敏感于其上下文的类/结构体内部。同时,您始终希望非常严格地确定放置在全局空间中的内容。 - That Realty Programmer Guy
3个回答

4
但是静态成员函数呢?它们在共享库中也同样危险吗?
完全不是:静态成员函数应该被使用,与代表共享状态的静态变量不同,静态成员函数代表共享计算。只要这些计算是无状态的,它们就一点也不危险。

变量是可变的,静态成员函数与简单函数一样是不可变的。因此,无论变量可能存在什么问题,函数都不会共享它。 - didierc

3

静态函数并不是问题。实际上,许多在科学软件中常用的函数都是纯数学函数,例如sin()sqrt()log()

另一方面,静态变量是共享状态的指示器,应该避免使用。


1

并非固有的。一个不使用任何静态状态(例如仅使用本地或线程本地变量的函数)的静态成员函数是安全的。这样的方法经常在备受尊重的库中使用,例如boost或guava(最后一个例子来自Java世界)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接