我现在正在移植一个单线程库来支持多线程,并且我需要使用局部静态或全局变量的函数的完整列表。
任何信息表示赞赏。
检查您使用的每个函数的手册页......非线程安全的函数将被标识为这样,并且手册页将在有线程安全版本时提及(例如,readdir_r
)。您可以通过在手册页上运行脚本来提取列表。
编辑:虽然我的回答已被接受,但我担心它不准确并且可能很危险。例如,虽然 strerror_r 提到它是 strerror 的线程安全版本,但 strerror 本身并没有说明线程安全......它说的是“字符串可能被覆盖”,这仅仅意味着它不是线程安全的. 因此,您至少需要搜索“可能被覆盖”和“线程”,但不能保证即使这样也会完整。
知道特定函数是否可重入总是一个好主意,但您还必须考虑可能从多个线程的共享代码段调用多个可重入函数的情况,这也可能导致使用共享数据时出现问题.
因此,如果您在线程之间共享任何数据,则必须“保护”数据,而不管被调用的函数是可重入的。
考虑以下函数:
void yourFunc(CommonObject *o)
{
/* This function is NOT thread safe */
reentrant_func1(o->propertyA);
reentrant_func2(o->propertyA);
}
如果此函数不受互斥体保护,您将在多线程应用程序中得到不希望的行为,而不管 func1 和 func2 是可重入的事实。