2011-12-16 22 views
22

Mô tả về vấn đề chính nó là khá đơn giản. Tôi đang thử nghiệm sự khác biệt của std :: thread thư viện trong C + + 11 và tăng :: thư viện thread.Tại sao có một sự khác biệt bằng cách sử dụng std :: thread :: hardware_concurrency() và tăng :: thread :: hardware_concurrency()?

Kết quả của những:

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

mang lại cho tôi kết quả khác nhau:

0 
4 

Tại sao vậy?

PS: Phiên bản của gói gcc là 4.6.2-1.fc16 (x86_64). Tôi đang sử dụng

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

Trả lời

19

Sau khi xem xét /usr/include/c++/4.6.2/thread

có thể thấy rằng triển khai thực sự là:

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

Vì vậy, vấn đề được giải quyết. Đó chỉ là một tính năng chưa được triển khai trong gcc 4.6.2

6

Phương pháp được sử dụng bởi biên dịch cài đặt lại tăng được hỗ trợ cho mục tiêu của bạn, trong khi cài đặt lại tăng trình biên dịch không hỗ trợ tính năng này cho mục tiêu của bạn.

TFM nói:

Số lượng đề phần cứng có sẵn trên hệ thống hiện tại (ví dụ: số CPU hoặc lõi hoặc đơn vị hyperthreading), hoặc 0 nếu thông tin này là không có sẵn.

CHỈNH SỬA: làm xước, đảo ngược nó.

EDIT2: Tính năng này hiện diện trên the trunk, nhưng vắng mặt trong 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

Nhưng thực sự tăng :: luồng có thể hiển thị thông tin chính xác 4, trong khi C++ 11 cho tôi 0 ... – derekhh

+0

@derekhh: rất có khả năng triển khai C++ 11 của bạn chỉ là một bộ xương và không thực sự làm việc – Dani

+0

@Dani: Tôi đã sử dụng g ++ 4.6.2 ... – derekhh

Các vấn đề liên quan