2013-05-01 16 views
8

Tôi mới dùng Boost.Threads và đang cố gắng hiểu cách chuyển đối số hàm vào hàm boost::thread_groups::create_thread(). Sau khi đọc một số hướng dẫn và các tài liệu tăng cường, tôi hiểu rằng có thể chỉ đơn giản là vượt qua các đối số cho chức năng này nhưng tôi không thể có được phương pháp này để làm việc. Phương pháp khác mà tôi đọc là sử dụng functors để liên kết các tham số với hàm của tôi nhưng điều đó sẽ tạo các bản sao của các đối số và tôi yêu cầu nghiêm ngặt tham chiếu const đó vì các đối số sẽ là các ma trận lớn (điều này tôi dự định làm bằng cách sử dụng boost::cref(Matrix) khi tôi nhận được ví dụ đơn giản này để làm việc).Cách chuyển các tham số chức năng để tăng :: thread_groups :: create_thread()

Bây giờ, chúng ta hãy bắt tay vào các mã:

void printPower(float b, float e) 
{ 
    cout<<b<<"\t"<<e<<"\t"<<pow(b,e)<<endl; 
    boost::this_thread::yield(); 
    return; 
} 

void thr_main() 
{ 
    boost::progress_timer timer; 
    boost::thread_group threads; 
    for (float e=0.; e<20.; e++) 
    { 
     float b=2.; 
     threads.create_thread(&printPower,b,e); 
    } 
    threads.join_all(); 
    cout << "Threads Done" << endl; 
} 

này không biên dịch với các lỗi sau:

mt.cc: In function âvoid thr_main()â: 
mt.cc:46: error: no matching function for call to âboost::thread_group::create_thread(void (*)(float, float), float&, float&)â 
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: In member function âvoid boost::detail::thread_data<F>::run() [with F = void (*)(float, float)]â: 
mt.cc:55: instantiated from here 
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: error: too few arguments to function 

Tôi đang làm gì sai?

Trả lời

15

Bạn không thể chuyển đối số cho hàm boost::thread_group::create_thread() vì nó chỉ có một đối số. Bạn có thể sử dụng boost::bind:

threads.create_thread(boost::bind(printPower, boost::cref(b), boost::cref(e))); 
#           ^to avoid copying, as you wanted 

Hoặc, nếu bạn không muốn sử dụng boost::bind, bạn có thể sử dụng boost::thread_group::add_thread() như thế này:

threads.add_thread(new boost::thread(printPower, b, e)); 
+0

Cách tiếp cận thứ hai là thích hợp cho vấn đề của tôi kể từ khi tôi không thể đủ khả năng để thực hiện bất kỳ bản sao của các đối số. Tuy nhiên, nó ném lỗi sau: '/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: Trong chức năng thành viên không tăng :: chi tiết :: thread_data :: run() [with F = void (*) (float, float)] â: mt.cc:55: được khởi tạo từ đây /usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: lỗi: quá ít đối số function' – Mindstorm

+0

@Mindstorm, hmm ... Mã với 'add_thread' hoạt động cho tôi (tăng v1.53). – soon

+0

@Mindstorm, về tránh sao chép: chỉ cần sử dụng 'boost :: cref' như bạn đã nói. Tôi đã cập nhật câu trả lời. – soon

5

Đối với linh hoạt hơn bạn có thể sử dụng:

- Hàm lambda (C++ 11): What is a lambda expression in C++11?

threads.create_thread([&b,&e]{printPower(b,e);}); 

-Các hàm lưu trữ các đối số dưới dạng tham chiếu const.

struct PPFunc { 
    PPFunc(const float& b, const float& e) : mB(b), mE(e) {} 
    void operator()() { printPower(mB,mE); } 
    const float& mB; 
    const float& mE; 
}; 

-std :: bind (C++ 11) hoặc đẩy mạnh :: bind

+0

Cảm ơn Peter! Những phương pháp này cũng hoạt động tốt. – Mindstorm

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