【问题标题】:Why implicit declaration of pthread_yield with -lpthread while all ok with -pthread?为什么使用 -lpthread 隐式声明 pthread_yield 而使用 -pthread 则一切正常?
【发布时间】:2015-11-17 10:29:59
【问题描述】:

我在 CentOS7 中用 gcc 编译了这段代码 main.c:

#include <pthread.h>
void* mystart(void* arg)
{
    pthread_yield();
    return(0);
}
int main(void)
{
    pthread_t pid;
    pthread_create(&pid, 0, mystart, 0);
    return(0);
}

第一次编译:gcc -Wall -g main.c -pthread -o a.out
没关系。

第二次编译:gcc -Wall -g main.c -lpthread -o a.out

警告:函数“pthread_yield”的隐式声明 [-Wimplicit-function-declaration]

  1. 第二个a.out 还能正常运行吗?
  2. 如何在没有-pthread 的情况下修复警告? sched_yield 是产生 pthread 的另一种方式吗?

【问题讨论】:

  • 如何在没有-pthread 的情况下修复警告?”自己提供缺少的原型。
  • 我无法在 CentOS 7 上重现这个,两者都在此处给出警告。

标签: c linux gcc pthreads


【解决方案1】:

应该使用-pthread 进行编译和链接。它不仅链接库,还设置预处理器定义,有时还会选择不同的运行时库(例如在 Windows 上)。

【讨论】:

  • 我的第二个问题是:pthread_yield 和 sched_yield 之间的区别。它们的行为是否相同?
  • @zhaochenyou:一题一题。这就是规则。此外,这是您正确回答问题的唯一方法。
【解决方案2】:

pthread_yield() 是一个非标准函数,通常通过定义来启用

#define _GNU_SOURCE

虽然您应该使用 -pthread 进行编译,但我希望您在 both 编译时会收到相同的警告(除非 -pthread 定义了 _GNU_SOURCE 可能是这种情况)。

正确的解决方法是使用非标准函数pthread_yield(),而使用POSIX函数sched_yield(),而不是包含#include &lt;sched.h&gt;

【讨论】:

  • -pthread 在 linux 上的唯一区别是它添加了一个 #define _REENTRANT 1
  • 这也是我看到的唯一区别。但 OP 报告说他没有收到 -pthread 的警告,我觉得这很奇怪。
  • 这是我的错误,确实-pthread和-lpthread都会生成警告'implicit of pthread_yield'。
  • @zhaochenyou 对。感谢您的确认。这就是我所期望的。因此,如果您想使用非标准函数pthread_yield(),则可以在包含任何标题之前定义_GNU_SOURCE。或者更好的是,使用sched_yield()
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多