Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法测试C标准库中是否有线程安全函数?_C_Libc - Fatal编程技术网

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

有没有办法测试C标准库中是否有线程安全函数?,c,libc,C,Libc,对于较新版本的C标准库,是否有跨平台的方法通过预处理器定义来判断它们是否可用?我指的是诸如localtime\u r()之类的函数 如果没有标准方法,GCC中的可靠方法是什么?[编辑]或带有unistd.h的posix系统?没有标准的方法来测试它,这意味着无法在所有平台上测试它。像autoconf这样的工具将创建一个调用此函数的小型C程序,然后尝试编译和链接它。如果这样做,看起来函数存在,如果不存在,那么它可能不存在(或者编译器选项错误,需要设置相应的CFLAGS) 因此,您基本上有6种选择:

对于较新版本的C标准库,是否有跨平台的方法通过预处理器定义来判断它们是否可用?我指的是诸如
localtime\u r()
之类的函数


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

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

因此,您基本上有6种选择:

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

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

  • 在运行时决定。根据平台的不同,可以执行“弱链接”,这样您就可以在运行时测试是否找到该函数(如果没有找到,则指向该函数的指针将指向
    NULL
    ),或者使用类似
    dlsym()
    (这也不是真正的可移植性,但在Linux/UNIX世界中得到广泛支持)。但是,在这种情况下,如果在运行时找不到该函数,则需要回退

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

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

  • 让用户决定。要么总是使用回退,除非用户表示支持,要么相反(这可能更有意义),总是假设它存在,如果编译失败,提供一种用户可以强制代码进入“兼容模式”的方法,通过某种方式指定线程安全函数不可用(例如,通过设置环境变量或使用不同的make目标)。当然,这是(较差)用户最不方便的方法


  • 这就是autoconf的初衷。最好使用autoconf。autoconf将为您创建测试。如上所述,但使用CMake;)如果可以用预处理器完成,他们就不必发明autoconf、CMake等。这些函数在POSIX中是必需的,因此如果
    \POSIX\u VERSION
    定义为与包含
    unistd.h
    后的POSIX的合理最新版本相匹配的内容,这些函数必须可用。@vonbrand请参阅我的回复命令我确实很喜欢R.的评论,因为它在很多方面都符合我的问题。它基本上是对你的第(5)子部分的更具体的回答,这是我在GCC后续问题中得到的。谢谢你的写作,非常好!