C++ std::this_thread::yield与linux上的sched_yield有什么不同吗?
我只是想知道std::this_thread::yield是如何在linux上实现的,它与sched_yield有什么不同吗?我已经看到一些spinlock实现暗示std::this_thread::yield在线程放弃进程的时间方面比sched_yield更轻量级,这是真的吗?std::this_thread::yield的实现如下所示:C++ std::this_thread::yield与linux上的sched_yield有什么不同吗?,c++,linux,C++,Linux,我只是想知道std::this_thread::yield是如何在linux上实现的,它与sched_yield有什么不同吗?我已经看到一些spinlock实现暗示std::this_thread::yield在线程放弃进程的时间方面比sched_yield更轻量级,这是真的吗?std::this_thread::yield的实现如下所示: /// yield inline void yield() noexcept { #ifdef _GLIBCXX_USE_S
/// yield
inline void
yield() noexcept
{
#ifdef _GLIBCXX_USE_SCHED_YIELD
__gthread_yield();
#endif
}
符号_gthread_yield的定义如下:
# define __gthrw2(name,name2,type) \
static __typeof(type) name \
__attribute__ ((__weakref__(#name2), __copy__ (type))); \
__gthrw_pragma(weak type)
# define __gthrw_(name) __gthrw_ ## name
...
/* Typically, __gthrw_foo is a weak reference to symbol foo. */
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name)
...
__gthrw(sched_yield)
...
static inline int
__gthread_yield (void)
{
return __gthrw_(sched_yield) ();
}
因此,基本上在gcc中,如果定义了_GLIBCXX_USE_sched_yield,那么调用std::this_thread::yield调用sched_yield。您可以发现,include中是否定义了_GLIBCXX_USE_SCHED_YIELD,但在linux x86或x86_64上很可能定义了它。因此,STD::THEXTHORIT::收益率应该只调用GDCGNU编译器集合和LIbSTDC++ + GNU C++库的实现上的SHDEDURE。p>
/// yield
inline void
yield() noexcept
{
#ifdef _GLIBCXX_USE_SCHED_YIELD
__gthread_yield();
#endif
}
符号_gthread_yield的定义如下:
# define __gthrw2(name,name2,type) \
static __typeof(type) name \
__attribute__ ((__weakref__(#name2), __copy__ (type))); \
__gthrw_pragma(weak type)
# define __gthrw_(name) __gthrw_ ## name
...
/* Typically, __gthrw_foo is a weak reference to symbol foo. */
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name)
...
__gthrw(sched_yield)
...
static inline int
__gthread_yield (void)
{
return __gthrw_(sched_yield) ();
}
因此,基本上在gcc中,如果定义了_GLIBCXX_USE_sched_yield,那么调用std::this_thread::yield调用sched_yield。您可以发现,include中是否定义了_GLIBCXX_USE_SCHED_YIELD,但在linux x86或x86_64上很可能定义了它。因此,STD::THEXTHORIT::收益率应该只调用GDCGNU编译器集合和LIbSTDC++ + GNU C++库的实现上的SHDEDURE。p>
在大多数linux实现中,这很可能是错误的。那么std::this\u thread::yield应该只调用thread\u yield-你的意思是说std::this\u thread::yield应该只调用sched\u yield吗?那么std::this_thread::yield应该只调用thread_yield-你是说std::this_thread::yield应该只调用sched_yield吗?