2011-12-16 31 views
22

La descripción del problema en sí es bastante simple. Estoy probando las diferencias de la biblioteca std :: thread en C++ 11 y boost :: la biblioteca de hilos.¿Por qué hay una diferencia al usar std :: thread :: hardware_concurrency() y boost :: thread :: hardware_concurrency()?

La salida de estos:

#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; 
} 

me da resultados diferentes:

0 
4 

¿Por qué?

PD: La versión del paquete gcc es 4.6.2-1.fc16 (x86_64). Estoy usando

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

Respuesta

19

Después de revisar /usr/include/c++/4.6.2/thread

se puede observar que la implementación es en realidad:

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

So problem resuelto. Es solo otra característica que no se ha implementado en gcc 4.6.2

6

El método empleado por el compilador instalación de refuerzo es compatible para su objetivo, mientras que su instalación de impulso compilador no admite esta función para su objetivo.

TFM dice:

El número de hilos de hardware disponible en el sistema actual (por ejemplo, número de CPU o núcleos o unidades hyperthreading), o 0 si esta información no está disponible.

EDITAR: rayar eso, invertirlo.

Edit2: Esta función está presente en the trunk, pero ausente en 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; 
+0

Pero en realidad boost :: thread puede mostrar la información correcta 4, mientras que C++ 11 me da 0 ... – derekhh

+0

@derekhh: es muy probable que su implementación de C++ 11 es solo un esqueleto y en realidad no funciona – Dani

+0

@Dani: he estado usando g ++ 4.6.2 ... – derekhh