【问题标题】:Where can I find the list of non-reentrant functions provided in gnu libc?在哪里可以找到 gnu libc 中提供的不可重入函数列表?
【发布时间】:2012-09-26 06:30:39
【问题描述】:

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

感谢任何信息。

【问题讨论】:

  • 一般建议:除非手册页中另有说明,否则将所有函数视为不可可重入。
  • @JoachimPileborg 该建议如果应用于 glibc 手册,将产生大量误报;手册根本不是那样写的。 (人们想要的术语是“线程安全”,而不是“可重入”——它们的意思完全不同。重入是一个早于线程或任何其他类型的并发的概念。)
  • @JoachimPileborg 谢谢。我想我明白了你的意思,但这不是我要找的。我编写了一个脚本来搜索手册页并收集所有具有 function_r() 等效项的 function() 存在。我想这就是我需要的。
  • @longbowk No. reentrancy 意味着可以在函数处于活动状态时从异步中断调用该函数。考虑一个带有临界区的函数。它是线程安全的,但不可重入。
  • @JimBalter 是的。你说的对。我只是想你给我看的例子,并要纠正我问的问题。然后发现你已经回答了我。非常感谢你。那么我正在寻找的是非线程安全的,不是不可重入的。那么 Joachimileborg 的建议很好。

标签: c multithreading glibc


【解决方案1】:

检查您使用的每个函数的手册页...非线程安全的函数将被标识为这样,并且手册页将在有线程安全版本时提及(例如,readdir_r)。您可以通过在手册页上运行脚本来提取列表。

编辑:虽然我的回答已被接受,但我担心它不准确并且可能很危险。例如,虽然 strerror_r 提到它是 strerror 的线程安全版本,但 strerror 本身并没有说明线程安全......它说的是“字符串可能被覆盖”,这只是 暗示它不是线程安全的。因此,您至少需要搜索“可能被覆盖”和“线程”,但不能保证即使是完整的。

【讨论】:

  • 这确实是我想要的。谢谢。
  • @longbowk 请参阅我添加的警告。
  • 嗨。谢谢你。我看到了你的警告。但是没有 function_r() 等效项的 function() 使用局部静态或全局变量是否有例外?
  • @longbowk 我认为没有这样的例外,因为在使库线程安全方面付出了很多努力,但同样,“没有保证”。
  • 好的。知道了。我会搜索说“覆盖”,“线程”的手册。等等,并检查是否有更多的功能需要添加到列表中。
【解决方案2】:

了解特定函数是否可重入总是一个好主意,但您还必须考虑可能从多个线程的共享代码段调用多个可重入函数的情况,这也可能导致问题使用共享数据。

因此,如果您在线程之间共享任何数据,则数据必须受到“保护”,而不管被调用的函数是可重入的。

考虑以下函数:

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

如果此函数不受互斥体保护,您将在多线程应用程序中得到不希望的行为,而不管 func1 和 func2 是可重入的。

【讨论】:

  • 谢谢。我已经想到了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-10-09
  • 2012-07-31
  • 2012-08-08
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多