C++定义pthreads的函数(如果未声明该函数)

zhte4eai  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(219)

很明显,新版本的ubuntu(22.04以后)没有Pthreads函数pthread_yield,但是包含了sched_yield
所以我的解决方案是在我的项目中包含一个.c文件,并使用以下函数:

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

这解决了我在ubuntu22.04下遇到的问题,但是pthread_yield存在的其他版本呢?
我想只在pthreads中没有这个函数的情况下定义它,我该怎么做呢?

dvtswwa3

dvtswwa31#

这里的问题是简化的“不存在于pthreads中”。“pthreads”到底是什么?
在基本级别上,pthread_yield不是IEEE Std 1003(POSIX)线程的一部分。
它在<pthread.h>的GNU实现中声明,条件是_GNU_SOURCE
这个实现曾经是在GUN的libpthread实现中,但是现在它被移到了Ubuntu 22中GNU的libc实现中。
与使用伪POSIX函数相比,使用sched_yield函数要干净得多,它已经存在很久了。

5sxhfpxr

5sxhfpxr2#

有了新的评论,听起来你有了另一种选择。Linux传统上有一个比C命令更可预测的库链接顺序。
特别是,C
说违反一个定义规则是未定义的行为,但是ld通常会选择第一个出现的符号,所以只需在 * -lpthread之后添加.o *。
还有更复杂的技巧与 * 弱符号 *,但这不应该是必要的。

相关问题