我正在 Linux 上创建一个 C 库,它有几个函数,它们一起对一些全局数据进行操作。为了使这些函数成为线程安全的,它们必须在代码中的适当位置使用互斥锁。
在 Linux 中,为了在应用程序中使用 pthread,需要链接到适当的库-lpthread。对于我的库一旦编译,我想让它的用户决定在他们的应用程序中使用 pthreads 以及如果他们不使用它。
如果开发人员在他们的应用程序中不使用线程,他们将不会链接到 pthread。因此,我希望我的编译库不需要它,此外,在单线程应用程序中使用互斥锁会使用不必要的开销(更不用说是愚蠢的)。
是否有某种方法可以编写代码(如果需要,可以使用 GCC 扩展),只有在链接了某些符号的情况下,某个代码块才会运行?我知道我可以使用dlopen()和朋友,但这本身就需要我试图避免的一些事情。我想我正在寻找的东西必须存在,因为几个标准函数在同一条船上,并且需要互斥锁是线程安全的(并且它们是),但即使没有与 pthreads 链接也可以工作。
在这一点上,我注意到FreeBSD 的 popen() 函数在第 66 行和第 67 行使用了一个不可移植的检查 - isthreaded来确定是否使用了线程,以及是否使用互斥锁。我怀疑这样的事情是否以任何方式标准化。但更重要的是,如果无法识别符号,则此类代码无法编译和链接,而在 Linux 中,如果未链接 pthread,则互斥符号甚至不会出现。
总结一下:在 Linux 上,如何创建一个库,它知道何时还使用线程,如果是,则在适当的情况下使用互斥锁,并且不需要链接到 pthread,除非应用程序开发人员特别想在某处使用线程?