我在哪里可以找到gnu libc中提供的非重入函数列表?

时间:2012-09-26 06:30:40

标签: c multithreading glibc

我现在正在移植一个单线程库以支持多线程,我需要使用本地静态或全局变量的整个函数列表。

感谢任何信息。

2 个答案:

答案 0 :(得分:2)

检查您使用的每个功能的手册页...非线程安全的功能将被识别,手册页将提供一个线程安全版本(例如readdir_r )。您可以通过在手册页上运行脚本来提取列表。

编辑:虽然我的答案已被接受,但我担心这是不准确的,可能是危险的。例如,虽然strerror_r提到它是strerror的线程安全版本,但是strerror本身并没有提及线程安全......它所说的是“字符串可能会被覆盖”,这只是暗示它不是线程安全的。所以你需要搜索至少“可能被覆盖”以及“线程”,但不能保证即使这样也会完成。

答案 1 :(得分:1)

知道特定函数是否可重入总是一个好主意,但是当你可以从多个线程的共享代码段调用几个可重入函数时,你也必须考虑这种情况,这也可能导致问题。使用共享数据。

因此,如果您在线程之间共享任何数据,则无论被调用的函数是可重入的这一事实,数据都必须“受到保护”。

考虑以下功能:

void yourFunc(CommonObject *o)
{
    /* This function is NOT thread safe */
    reentrant_func1(o->propertyA);
    reentrant_func2(o->propertyA);
}

如果此函数不受互斥保护,则无论func1和func2是否可重入,都会在多线程应用程序中出现意外行为。