繁体   English   中英

有没有办法测试 C 标准库中是否提供线程安全函数?

[英]Is there a way to test whether thread safe functions are available in the C standard library?

关于较新版本的 C 标准库中的线程安全函数,是否有一种跨平台的方法可以通过预处理器定义来判断这些函数是否可用? 我指的是localtime_r()等函数。

如果没有标准方式,那么GCC中可靠的方式是什么? [编辑] 还是带有 unistd.h 的 posix 系统?

没有标准的方法来测试它,这意味着无法在所有平台上测试它。 autoconf工具将创建一个调用此函数的微型 C 程序,然后尝试编译和链接它。 这有效,看起来该函数存在,如果不存在,则它可能不存在(或编译器选项错误,需要设置适当的CFLAGS )。

所以你基本上有 6 个选择:

  1. 要求它们存在。 你的代码只能在它们存在的平台上工作; 时期。 如果它们不存在,编译将失败,但这不是您的问题,因为平台违反了您的最低要求。

  2. 避免使用它们。 如果您使用非线程安全的,可能受全局锁(例如互斥锁)保护,它们是否存在并不重要。 当然,您的代码只能在具有 POSIX 互斥锁的平台上运行,但是,如果一个平台没有 POSIX 互斥锁,那么它也不会有 POSIX 线程,如果它没有 POSIX 线程(我猜您可能正在使用 POSIX 线程 w /o 支持任何替代方案),为什么您首先要担心线程安全?

  3. 在运行时决定。 根据平台,要么做一个“弱链接”,这样你就可以在运行时测试是否找到了函数(如果没有找到,指向函数的指针将指向NULL ),或者使用某些东西动态解析符号像dlsym() (它也不是真正可移植的,但在 Linux/UNIX 世界中得到广泛支持)。 但是,在这种情况下,如果在运行时找不到该函数,则需要回退。

  4. 使用类似autoconf工具、具有类似功能的其他工具或您自己的配置脚本在开始编译之前确定这一点(并且可能根据结果设置预处理器宏)。 在这种情况下,您还需要一个后备解决方案。

  5. 将使用限制在众所周知的平台上。 这个功能在某个平台上是否可用通常是已知的(一旦可用,将来就不会消失)。 大多数平台公开预处理器宏来测试平台是什么类型,有时甚至是哪个版本。 例如,如果您知道 GNU/Linux、Android、Free/Open/NetBSD、Solaris、iOS 和 MacOS X 都提供此功能,请测试您是否正在为这些平台之一进行编译,如果是,请使用它。 如果代码是为另一个平台编译的(或者如果您无法确定它是什么平台),它可能会或可能不会提供此功能,但由于您无法确定,最好确保安全并使用回退。

  6. 让用户决定。 要么始终使用回退,除非用户表示支持或反其道而行(这可能更有意义),始终假设它在那里,以防编译失败,提供一种用户可以强制您的代码“兼容”的方法模式”,通过某种方式指定线程安全函数不可用(例如,通过设置环境变量或使用不同的 make 目标)。 当然,对于(穷)用户来说,这是最不方便的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM