Чем std :: this_thread :: yield отличается от sched_yield на linux? - PullRequest
1 голос
/ 05 января 2020

Мне просто интересно, как std::this_thread::yield реализован на linux и отличается ли он от sched_yield? Я видел некоторые реализации спин-блокировки, которые подразумевают, что std::this_thread::yield является чем-то более легким, чем sched_yield с точки зрения того, как долго потоки отказываются от процесса, это правда?

1 Ответ

4 голосов
/ 05 января 2020

Реализация 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 реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...