Реализация std::this_thread::yield
в библиотеке libstdc ++ выглядит следующим образом:
/// yield
inline void
yield() noexcept
{
#ifdef _GLIBCXX_USE_SCHED_YIELD
__gthread_yield();
#endif
}
Символ __gthread_yield
определяется как в г cc в гтре -posix.h , из которого нам потребуется следующее:
# 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) ();
}
Так что в основном в g cc вызов std::this_thread::yield
вызывает sched_yield
, если определено _GLIBCXX_USE_SCHED_YIELD
. Вы можете найти, если _GLIBCXX_USE_SCHED_YIELD
определено в #include <bits/c++config.h>
, но для linux x86 или x86_64 оно, скорее всего, определено. Так что std::this_thread::yield
должен просто вызвать sched_yield
для реализации, использующей g cc GNU Compiler Collection и libstdc ++ библиотеку GNU C ++.
В стандартной библиотеке C ++ "libc ++" определение функции std::this_thread::yield
можно найти в libcxx / thread :
inline _LIBCPP_INLINE_VISIBILITY
void yield() _NOEXCEPT {__libcpp_thread_yield();}
Символ __libcpp_thread_yield
определен в libcxx / threading_support :
void __libcpp_thread_yield()
{
sched_yield();
}
Таким образом, clang-компилятор (ie. Компилятор, использующий стандартную библиотеку libc ++ C ++) также вызывает sched_yield
для std::this_thread::yield
.
Мне просто интересно, как std :: this_thread :: yield реализован на linux и отличается ли он от sched_yield?
Скорее всего, это то же самое в большинстве linux реализаций.
это правда?
Это, скорее всего, ложь в большинстве linux реализации.