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?
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
@Mindstorm, hmm ... Mã với 'add_thread' hoạt động cho tôi (tăng v1.53). – soon
@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