【问题标题】:C++ define pthreads' function if that function is not declared如果未声明该函数,则 C++ 定义 pthreads 函数
【发布时间】:2023-02-05 08:07:50
【问题描述】:

显然较新版本的 ubuntu(22.04 以上)没有 Pthreads 函数 pthread_yield 但它们包含 sched_yield

所以我的解决方案是在我的项目中包含一个具有以下功能的 .c 文件:

#include <sched.h>
int pthread_yield(void) { return sched_yield(); }

这解决了我在 ubuntu 22.04 下的问题,但是存在 pthread_yield 的其他版本呢?

我想仅在 pthreads 中不存在时才定义此函数,我该怎么做?

【问题讨论】:

  • 我想仅在 pthreads 中不存在时才定义此函数,我该怎么做?RTFM: #define _GNU_SOURCE /* See feature_test_macros(7) */
  • 你能详细说明一下吗?这是否意味着如果存在 _GNU_SOURCE,则不需要 fake 函数? _GNU_SOURCE 的存在是不是有点太笼统了?

标签: c++ pthreads


【解决方案1】:

您的问题是简化的“不存在于 pthreads 中”。 “pthreads”到底是什么?

在基本级别,pthread_yield 不是 IEEE Std 1003 (POSIX) 线程的一部分。

它在 &lt;pthread.h&gt; 的 GNU 实现中声明,以 _GNU_SOURCE 为条件。

该实现曾经在 GUN 的 libpthread 实现中,但在 Ubuntu 22 中被转移到 GNU 的 libc 实现中。

与其使用伪 POSIX 函数,不如使用 sched_yield 函数更简洁。它已经存在多年了。

【讨论】:

  • 当然可以,但由于我正在处理 xpress MIP 求解器,它是封闭源代码,所以我没有机会这样做。我所做的只是与 -lpthreads 链接。如果伪造的 pthread_yield 函数不存在,则在任何地方都找不到 pthread_yield 函数,因此编译失败。伪造的 pthread_yield 函数挽救了局面,但可能会破坏自然存在 pthread_yield 的系统,即 ubuntu 20.04
  • @SantiPeñate-Vera:那就有点问题了。与 Windows 不同,Linux 没有对闭源软件的一流支持。部分原因是碎片化——Ubuntu 只是一种 Linux 风格。核心思想一直是只在本地编译您的软件。 (这就是为什么没有等同于 Windows SDK 的原因)
【解决方案2】:

有了新评论,听起来您还有另一种选择。 Linux 传统上有一个比 C++ 指令更可预测的库链接顺序。

特别是,C++ 表示违反单一定义规则是未定义行为,但 ld 通常会选择符号的第一次出现。所以只需添加您的.o-lpthread

还有更复杂的技巧弱符号但这在这里不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多