Почему существует разница с использованием 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
Ответы
Ответ 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;