很明显,新版本的ubuntu(22.04以后)没有Pthreads函数pthread_yield
,但是包含了sched_yield
所以我的解决方案是在我的项目中包含一个.c文件,并使用以下函数:
#include <sched.h>
int pthread_yield(void) { return sched_yield(); }
这解决了我在ubuntu22.04下遇到的问题,但是pthread_yield
存在的其他版本呢?
我想只在pthreads中没有这个函数的情况下定义它,我该怎么做呢?
2条答案
按热度按时间dvtswwa31#
这里的问题是简化的“不存在于pthreads中”。“pthreads”到底是什么?
在基本级别上,
pthread_yield
不是IEEE Std 1003(POSIX)线程的一部分。它在
<pthread.h>
的GNU实现中声明,条件是_GNU_SOURCE
。这个实现曾经是在GUN的
libpthread
实现中,但是现在它被移到了Ubuntu 22中GNU的libc
实现中。与使用伪POSIX函数相比,使用
sched_yield
函数要干净得多,它已经存在很久了。5sxhfpxr2#
有了新的评论,听起来你有了另一种选择。Linux传统上有一个比C命令更可预测的库链接顺序。
特别是,C说违反一个定义规则是未定义的行为,但是
ld
通常会选择第一个出现的符号,所以只需在 *-lpthread
之后添加.o
*。还有更复杂的技巧与 * 弱符号 *,但这不应该是必要的。