1. 程式人生 > >boost常用庫的使用總結

boost常用庫的使用總結

一、多執行緒:
1、thread庫相關的,c++多執行緒是一個複雜的事情,windows MFC提供了CWinThread類,WaitForSingleObject等待回收執行緒;
Linux系統提供了createThread,thread join來回收執行緒。
boost::thread就比較方便了:
1)、boost::thread(boost::bind(&class::func,this)).detach()。thread()啟動一個執行緒,bind執行緒繫結的
需要執行的任務接一個函式指標,detach,父執行緒不需要管子執行緒的回收。
2)、boost::thread thd1(func());引數是一個函式呼叫
      thd1.join();父執行緒來進行回收。
2、執行緒同步用互斥量boost::mutex,鎖用boost::mutex::scoped_lock,來進行時序控制。
比如boost::mutex::scoped_lock lock(m_mutex);互斥量相當於是鑰匙,lock相當於是鎖,當獲取這個鑰匙的鎖生命週期結束後,則鑰匙釋放。
mutex可以看成是通配的鑰匙。
還有一種是AutoLock<ThreadMutexLock> lock (&_operMutex);

二、網路程式設計:
網路程式設計分為同步模式和非同步模式,同步模式是有一個數據塊客戶端傳送過來,服務端就必須處理完才能處理下一個資料塊。
非同步模式是客戶端傳送的資料塊放入快取佇列,非同步處理不阻塞,同步模式是阻塞式的。
1、同步模式:
服務端:
// 建立伺服器物件
boost::asio::io_service ios;#asio程式設計必須的io_service物件,服務端和客戶端建立socket和服務端建立acceptor物件要用
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(),9800);#tcp協議的伺服器所在的ip和網路程式設計開放的埠,客戶端連線的ip和埠
boost::asio::ip::tcp::acceptor acceptor(ios,ep);
// 監聽連線
while(1){
     boost::asio::ip::tcp::socket sock(ios);#建立socket連線物件
     acceptor.accept(sock);
     cont<<sock.remote_endpoint().address()<<endl;

     boost::thread(boost::bind(svr_handle,sock)).detach();
}
//互動處理

void svr_handle(boost::asio::ip::tcp::socket sock)

{
      string msg;
      sock.write_some(boost::asio::buffer("hello world"));
      char msg[1024];
      sock.read_some(boost::asio::buffer(msg));
      cout<<"client send msg:"<<msg<<endl;

}
客戶端:
// 建立客戶端物件
boost::asio::io_service ios;#asio程式設計必須的io_service物件
boost::asio::ip::tcp::endpoint ep("127.0.0.1",9800);
//監聽連線
std::shared_ptr<boost::asio::ip::tcp::socket> p_sock(ios);#建立socket連線物件
p_sock->connect(ep);
string msg;
p_sock->write_some(boost::asio::buffer(msg));
char buf[1024];
p_sock->read_some(boost::asio::buffer(buf));

2、非同步模式


服務端:
監聽由同步模式的accept()變成了async_accept();
讀寫由同步模式的write_some()、read_some()變成了async_write_some()、async_read_some()
非同步模式關鍵是void Server::run(){ios.run();//io_service的run方法非同步處理佇列}。

boost::asio::io_service ios;

boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(),9800);

shared_ptr<boost::asio::ip::tcp::socket> s_ptr(new boost::asio::ip::tcp::socket(ios));

boost::asio::ip::tcp::acceptor acc(ios,ep);

start_accept();

ios.run();

void start_accept()

{acc.async_accept(*s_ptr,boost::bind(handle_accept,s_ptr,1));}

void handle_accept(shared_ptr<boost::asio::ip::tcp::socket> s_ptr,boost::system::error_code ec)

{

    if(err) return ;

    socket_ptr sock(new ip::tcp::socket(service));

    start_accept(sock);

}

當接收到客戶端連線的時候,handle_accept被呼叫。當連線之後socket則就能使用了。

客戶端:
連線由同步模式的connect()變成了async_connect();
讀寫由同步模式的write_some()、read_some()變成了async_write_some()、async_read_some()
非同步模式關鍵是void Client::run(){ios.run();//io_service的run方法非同步處理佇列}。

boost::asio::io_service ios;

boost::asio::ip::tcp::endpoint ep("127.0.0.1",9800);
//監聽連線
std::shared_ptr<boost::asio::ip::tcp::socket> p_sock(ios);#建立socket連線物件

p_sock->async_connect(ep,handle_connect);

ios.run();

void handle_connect(const boost::system::error_code ec)

{//如果ec返回成功了,就知道連線是成功的了}

當handle_connect連線上了,則ios.run()就會迴圈退出。

三、檔案系統:
檔案系統相關的方法一般都在boost::filesystem名稱空間中。
boost::filesystem::path filepath(path);
filepath.parent_path();//獲取父路徑
filepath.filename();//包括副檔名
boost::filesystem::file_size(filepath);//獲取檔案大小,單位是位元組
boost::filesystem::is_regular_file(path);//判斷是否是普通檔案
boost::filesystem::is_directory(path);//判斷是否是目錄
boost::filesystem::is_symlink(path);//判斷是否是連結檔案