为什么使用-pthread使用-lpthread隐式声明pthread_yield?

lin*_*bin 7 c linux gcc pthreads

我使用gcc在CentOS7中编译此代码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);
}
Run Code Online (Sandbox Code Playgroud)

第一次编译: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的方法吗?

P.P*_*.P. 6

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

#define _GNU_SOURCE
Run Code Online (Sandbox Code Playgroud)

虽然您应该-pthread用于编译,但我希望您在两个编译时都能得到相同的警告(除非-pthread定义_GNU_SOURCE可能是这种情况).

正确的修复方法是使用非标准功能pthread_yield(),sched_yield()而是使用POSIX功能代替#include <sched.h>.


Zan*_*ynx 5

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