为什么隐式声明pthread_yield与-lpthread,而所有与-pthread ok?

我在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. 如何解决警告没有-pthreadsched_yield是另一种产生pthread的方法吗?

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

pthread_yield()是一个通常由定义启用的非标准函数

 #define _GNU_SOURCE 

虽然你应该使用-pthread进行编译,但是我希望你能得到和两个编译相同的警告(除非-pthread定义了_GNU_SOURCE ,可能就是这种情况)。

正确的解决方法是使用非标准函数pthread_yield() ,而是使用POSIX函数sched_yield()而不是使用#include <sched.h>