boost::bind的功用,主要是將function變成function object(functor)來當成參數傳送,其目的,最主要是用來實現系統callback的功能。以下為一個簡單的小程式:
#include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <iostream> using namespace std; boost::asio::io_service io_service; void WorkerThread(int x){ std::cout < < "Thread Start:" << x << endl; io_service.run(); std::cout << "Thread Finish:" << x << endl; } int main( int argc, char * argv[] ){ boost::shared_ptr< boost::asio::io_service::work > work( new boost::asio::io_service::work( io_service )); std::cout < < "Press [Enter] to exit." << std::endl; boost::thread_group worker_threads; for( int x = 0; x < 4; ++x ) { worker_threads.create_thread( boost::bind( &WorkerThread, x )); } std::cin.get(); io_service.stop(); worker_threads.join_all(); system("pause"); return 0; }
boost::bind( &WorkerThread, x )中的x為我們在callback function中所指定要傳送進入的參數,二邊的個數只要一致就能夠順利的傳入。
下面的列子是用來bind一個class中的function menber:
#include <iostream> #include <boost/bind.hpp> class MyClass{ public: void F3( int i, float f ){ std::cout < < "i: " << i << std::endl; std::cout << "f: " << f << std::endl; } }; int main( int argc, char * argv[] ){ MyClass c; boost::bind( &MyClass::F3, &c, 42, 3.14f )(); system("pause"); return 0; }
只是,當我們使用bind要將io_service當作參數傳入給callback function的時候,會出現以下這個訊息:error C2248: ‘boost::noncopyable_::noncopyable::noncopyable’。這是由於io_service是不允許進行複制,這時候可以用以下二種方法來達成目的:一、傳址 二、使用smart point機制
方法一 傳址:
#include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <iostream> using namespace std; void WorkerThread(boost::asio::io_service* io_service, int x){ std::cout < < "Thread Start:" << x << endl; io_service->run(); std::cout < < "Thread Finish:" << x << endl; } int main( int argc, char * argv[] ){ boost::asio::io_service io_service; boost::shared_ptr< boost::asio::io_service::work > work( new boost::asio::io_service::work( io_service )); std::cout < < "Press [Enter] to exit." << std::endl; boost::thread_group worker_threads; for( int x = 0; x < 4; ++x ) { worker_threads.create_thread( boost::bind( &WorkerThread, &io_service, x )); } std::cin.get(); io_service.stop(); worker_threads.join_all(); system("pause"); return 0; }
方法二 smart pointer:
#include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> #include <iostream> using namespace std; void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service, int x ){ std::cout << "Thread Start:" << x << endl; io_service->run(); std::cout << "Thread Finish:" << x << endl ; } int main( int argc, char * argv[] ){ boost::shared_ptr< boost::asio::io_service > io_service( new boost::asio::io_service ); boost::shared_ptr< boost::asio::io_service::work > work( new boost::asio::io_service::work( *io_service ) ); std::cout << "Press [Enter] to exit." << std::endl; boost::thread_group worker_threads; for( int x = 0; x < 4; ++x ) { worker_threads.create_thread( boost::bind( &WorkerThread, io_service, x ) ); } std::cin.get(); io_service->stop(); worker_threads.join_all(); return 0; }
Leave a Reply