gpt4 book ai didi

c - 如何创建仅在链接 pthread 时才使用互斥锁的库?

转载 作者:太空狗 更新时间:2023-10-29 12:04:38 27 4
gpt4 key购买 nike

我正在 Linux 上创建一个 C 库,它有几个函数,它们一起对一些全局数据进行操作。为了使这些函数是线程安全的,它们必须在代码中的适当位置使用互斥体。

在 Linux 中,为了在应用程序中使用 pthread,需要链接到适当的库 -lpthread。对于我的库,一旦编译,我想让它在用户决定在他们的应用程序中使用 pthreads 以及他们不使用 pthreads 的情况下都能正常工作。

在开发人员不在其应用程序中使用线程的情况下,他们不会链接到 pthreads。因此,我希望我的编译库不需要它,此外,在单线程应用程序中使用互斥量会产生不必要的开销(更不用说这很愚蠢了)。

是否有某种方法可以编写代码(必要时使用 GCC 扩展),使某个代码块只有在链接了某些符号时才会运行?我知道我可以使用 dlopen() 和 friend ,但这本身就需要一些我试图避免的东西。我想我正在寻找的东西一定存在,因为几个标准函数在同一条船上,并且需要互斥体是线程安全的(它们是),但即使没有与 pthreads 链接也能工作。

在这一点上,我注意到 FreeBSD's popen() function第 66 和 67 行采用不可移植的检查 - isthreaded,以确定是否使用线程,以及是否使用互斥体。我怀疑这样的事情是否以任何方式标准化。但更重要的是,如果无法识别符号,则此类代码无法编译和链接,在 Linux 中,如果 pthread 未链接,互斥符号甚至不会出现。

总结一下:在 Linux 上,如何创建一个库,它知道何时也使用线程,如果是,则在适当的地方使用互斥锁,并且不需要针对 pthreads 进行链接,除非应用程序开发人员特别想使用线程在什么地方?

最佳答案

经过一些测试,Linux 似乎已经自动完成了我想要的操作!如果您使用线程,则只需要针对 pthreads 进行链接,如果您只需要 pthread 互斥支持则不需要。

在这个测试用例中:

#include <stdio.h>
#include <errno.h>
#include <pthread.h>

int main()
{
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

if (!(errno = pthread_mutex_lock(&mutex))) { puts("Mutex locked!"); }
else { perror("Could not lock mutex"); }

if (!(errno = pthread_mutex_lock(&mutex))) { puts("Mutex locked!"); }
else { perror("Could not lock mutex"); }

return 0;
}

在没有链接 pthreads 的情况下进行编译时,我看到“Mutex locked!”两次。这表明 pthread_mutex_lock() 本质上是一个非操作。但是在 pthreads 链接的情况下,运行这个应用程序将在第一次“Mutex locked!”后停止。打印出来。

因此,我可以在我的库中适本地使用互斥锁,并且不需要使用 pthreads,并且在不需要它的地方没有(重要的?)开销。

关于c - 如何创建仅在链接 pthread 时才使用互斥锁的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com