Asio的架構(gòu):Boost.Asio 設(shè)計索引
概念性了解API:boost::asio中的同步與異步
Asio的Buffer: buffer幾種用法,這些Buffer都只是引用外部的內(nèi)存數(shù)據(jù),如果需要拷貝和分配,記得使用boost::pool,這里還有一篇處理拷貝Buffer的文章
例子解析: Boost.asio的簡單使用(timer,thread,io_service類)
如果照著例子弄出的第一個服務(wù)器無法收到客戶端消息,試試這個asio::async_read與socket的async_read_some的區(qū)別
這里是另外一個區(qū)別:boost.asio庫學(xué)習(xí)筆記—— receive和read的區(qū)別:
從服務(wù)器連接過來的客戶端的地址:
std::string endpoint = socket.remote_endpoint( ).address( ).to_string();
以下是對這篇文章的翻譯:
asio chat_client.cpp中的一些問題
1. 有多少個線程在運行2個,還是3個?
>一般來說,依賴于運行的平臺,從程序的角度來說是2個,包括:
*主線程,用于處理用戶的輸入輸出
*io_service.run()線程,用于處理chat_client對象中的所有行為(action)
還有,async_write會創(chuàng)建一個線程或者其他的一些東西么?
>不會.
2. 有關(guān)1的問題,為什么write函數(shù)使用post直接調(diào)用?什么不調(diào)用async_write?既然調(diào)用了post,你只是將其放到一個隊列里在同一線程處理,為什么之后還要從其他線程調(diào)用async_write?
chat_client的成員對象不是線程安全的(故意?),因此要同步處理這些成員。如果直接從主線程調(diào)用async_write不是線程安全的,因為此時可能有后臺線程正在訪問socket。
在這個例子中,所有的類成員都調(diào)用io_services.post()以保證在一個線程里訪問,達(dá)到線程安全。io_services保證任何使用io_services.post()(或io_servies.dispatch())傳入的句柄只會在io_serive.run()線程被調(diào)用。而且這個例子中只有一個線程調(diào)用io_service.run(),所以chat_client的成員變量也只會在一個線程中被訪問。
4. 如果我想發(fā)送一個連接事件到主線程,怎樣做?用io_service::post?能從主線程獲取io_services?
在這個例子里是很困難的,因為主線程正在阻塞等待用戶信息。不過如果你想將事件在線程間傳遞,確實可以為每個線程配備一個io_services。
5. 為什么在main函數(shù)的最后調(diào)用了t.join(),能用io_service.run()代替么?
不行,請參考問題2的解答,那樣的話,線程安全將無法保證
6. 按照問題1的解答,如果有3個線程在運行(也就是,async_write被放到另外一個線程),那么哪個位置創(chuàng)建這個線程比較好?
因為主線程需要阻塞等待用戶信息,因此io_service::run是唯一需要的。如果你的程序不需要這樣做,那么就不需要其他線程,也就只需要簡單的調(diào)用io_service::run()就可以了,這也是大多數(shù)例子這樣做的原因
有關(guān)線程安全的問題
1. 對于asio對象,能從2個不同線程調(diào)用一個共享對象的不同成員么?
不能
那么其意義就是從2個不同線程訪問共享對象不是線程安全的?
是的
只有被標(biāo)記為 “共享對象:安全”的對象才能從不同線程同時訪問,io_service就是這樣的對象
2. 同樣是線程安全的問題,對于basic_deadline_timer::cancel()我需要用io_service.post(boost::bind(&deadline_timer::cancel, &myTimer))方法封裝調(diào)用么?
是的,直接調(diào)用cancel()也不是線程安全的
最好的解決方法就是使用io_service::post()將所有的操作都放在一個線程
3. asio有很多成員函數(shù),我怎么知道哪些能安全的調(diào)用?
一般情況下,你應(yīng)該認(rèn)為沒有任何一個函數(shù)是安全的,以下是通用的io線程安全判斷用例:
write+write:不安全
read+write:不安全
read+read:安全
asio對象已經(jīng)符合這種需求
這里有一篇介紹io_service眾多區(qū)別及包處理,拆包等的技術(shù)