有没有办法测试C标准库中是否有线程安全功能?

时间:2013-02-07 23:28:42

标签: c std

对于C标准库的较新版本中的thread safe functions,是否有一种跨平台的方式来判断这些是否可通过预处理器定义获得?我指的是诸如localtime_r()之类的功能。

如果没有标准方式,GCC的可靠方式是什么? [编辑]或使用unistd.h的posix系统?

1 个答案:

答案 0 :(得分:3)

没有标准的方法来测试,这意味着没有办法在所有平台上测试它。像autoconf这样的工具会创建一个微小的C程序来调用这个函数,然后尝试编译和链接它。它有效,看起来像函数存在,如果没有,那么它可能不存在(或者编译器选项错误,需要设置相应的CFLAGS)。

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

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

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

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

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

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

    < / LI>
  6. 让用户决定。要么总是使用回退,除非用户已发出信号支持或反过来做(这可能更有意义),总是假设它在那里,如果编译失败,提供一种方法,用户可以强制你的代码进入&# 34;兼容模式&#34;,通过某种方式指定线程安全功能不可用(例如,通过设置环境变量或使用不同的make目标)。当然,对于(差)用户来说,这是最不方便的方法。