Подтвердить что ты не робот

Почему существует разница с использованием std:: thread:: hardware_concurrency() и boost:: thread:: hardware_concurrency()?

Описание самой проблемы довольно просто. Я тестирую различия в библиотеке std:: thread в С++ 11 и boost:: thread library.

Выход из них:

#include <iostream>
#include <thread>
#include <boost/thread.hpp>

int main() {
  std::cout << std::thread::hardware_concurrency() << std::endl;
  std::cout << boost::thread::hardware_concurrency() << std::endl;
  return 0;
}

дает разные результаты:

0
4

Почему это?

PS: Версия пакета gcc - 4.6.2-1.fc16 (x86_64). Я использую

g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread
4b9b3361

Ответ 1

После просмотра/usr/include/С++/4.6.2/thread

видно, что реализация на самом деле:

// Returns a value that hints at the number of hardware thread contexts.
static unsigned int
hardware_concurrency()
{ return 0; }

Итак, проблема решена. Это еще одна функция, которая не была реализована в gcc 4.6.2

Ответ 2

Метод, используемый вашей установкой компилятор для повышения, поддерживается для вашей цели, тогда как ваш установка компилятора boost не поддерживает эту функцию для вашей цели.

TFM говорит:

Количество аппаратных потоков, доступных в текущей системе (например, количество процессоров или ядер или блоков гиперпотока) или 0, если эта информация недоступна.

РЕДАКТИРОВАТЬ: поцарапать, отменить его.

EDIT2: эта функция присутствует в соединительной линии, но отсутствует в 4.6.2:

~/tmp/gcc-4.6.2/libstdc++-v3/src> wc -l thread.cc
104 thread.cc
~/tmp/gcc-4.6.2/libstdc++-v3/src> grep concurrency thread.cc | wc -l
0
~/tmp/gcc-4.6.2/libstdc++-v3> grep -C 2 VERIFY testsuite/30_threads/thread/members/hardware_concurrency.cc

  // Current implementation punts on this.
  VERIFY( std::thread::hardware_concurrency() == 0 );

  return 0;