• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            Asio的架構:Boost.Asio 設計索引

            概念性了解API:boost::asio中的同步與異步

            Asio的Buffer: buffer幾種用法,這些Buffer都只是引用外部的內存數據,如果需要拷貝和分配,記得使用boost::pool,這里還有一篇處理拷貝Buffer的文章

            例子解析: Boost.asio的簡單使用(timer,thread,io_service類)

            如果照著例子弄出的第一個服務器無法收到客戶端消息,試試這個asio::async_read與socket的async_read_some的區別

            這里是另外一個區別:boost.asio庫學習筆記—— receive和read的區別

             

            從服務器連接過來的客戶端的地址:

            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會創建一個線程或者其他的一些東西么?

            >不會.

            2. 有關1的問題,為什么write函數使用post直接調用?什么不調用async_write?既然調用了post,你只是將其放到一個隊列里在同一線程處理,為什么之后還要從其他線程調用async_write?

            chat_client的成員對象不是線程安全的(故意?),因此要同步處理這些成員。如果直接從主線程調用async_write不是線程安全的,因為此時可能有后臺線程正在訪問socket。

            在這個例子中,所有的類成員都調用io_services.post()以保證在一個線程里訪問,達到線程安全。io_services保證任何使用io_services.post()(或io_servies.dispatch())傳入的句柄只會在io_serive.run()線程被調用。而且這個例子中只有一個線程調用io_service.run(),所以chat_client的成員變量也只會在一個線程中被訪問。

            4. 如果我想發送一個連接事件到主線程,怎樣做?用io_service::post?能從主線程獲取io_services?

            在這個例子里是很困難的,因為主線程正在阻塞等待用戶信息。不過如果你想將事件在線程間傳遞,確實可以為每個線程配備一個io_services。

            5. 為什么在main函數的最后調用了t.join(),能用io_service.run()代替么?

            不行,請參考問題2的解答,那樣的話,線程安全將無法保證

            6. 按照問題1的解答,如果有3個線程在運行(也就是,async_write被放到另外一個線程),那么哪個位置創建這個線程比較好?

            因為主線程需要阻塞等待用戶信息,因此io_service::run是唯一需要的。如果你的程序不需要這樣做,那么就不需要其他線程,也就只需要簡單的調用io_service::run()就可以了,這也是大多數例子這樣做的原因

             

            有關線程安全的問題

            1. 對于asio對象,能從2個不同線程調用一個共享對象的不同成員么?

            不能

            那么其意義就是從2個不同線程訪問共享對象不是線程安全的?

            是的

            只有被標記為 “共享對象:安全”的對象才能從不同線程同時訪問,io_service就是這樣的對象

            2. 同樣是線程安全的問題,對于basic_deadline_timer::cancel()我需要用io_service.post(boost::bind(&deadline_timer::cancel, &myTimer))方法封裝調用么?

            是的,直接調用cancel()也不是線程安全的

            最好的解決方法就是使用io_service::post()將所有的操作都放在一個線程

            3. asio有很多成員函數,我怎么知道哪些能安全的調用?

            一般情況下,你應該認為沒有任何一個函數是安全的,以下是通用的io線程安全判斷用例:

            write+write:不安全

            read+write:不安全

            read+read:安全

            asio對象已經符合這種需求

             

            這里有一篇介紹io_service眾多區別及包處理,拆包等的技術

            posted on 2010-09-28 15:22 戰魂小筑 閱讀(2848) 評論(0)  編輯 收藏 引用 所屬分類: 網絡 服務器技術C++/ 編程語言
            国产激情久久久久影院老熟女免费 | 一级做a爰片久久毛片人呢| 久久精品国产亚洲AV大全| 久久免费精品视频| 久久久青草青青国产亚洲免观| 亚洲精品国产综合久久一线| 亚洲欧美日韩中文久久| 久久国产热这里只有精品| 无码人妻少妇久久中文字幕蜜桃 | 青草国产精品久久久久久| 色偷偷888欧美精品久久久| 国产99久久久国产精品小说| 99久久婷婷免费国产综合精品| 久久久久久国产a免费观看不卡| 国产精品99久久久精品无码| 久久综合丁香激情久久| 亚洲AV成人无码久久精品老人| 一本一道久久精品综合| 久久精品国产亚洲AV无码娇色| 久久天天躁狠狠躁夜夜2020| 99久久人妻无码精品系列| 热综合一本伊人久久精品| 亚洲va久久久噜噜噜久久男同| 国内精品久久久久久不卡影院| 亚洲国产精品久久久天堂 | 伊人久久国产免费观看视频| 久久精品国产99久久无毒不卡 | 欧美黑人又粗又大久久久| 伊人色综合久久天天网| 久久精品国产色蜜蜜麻豆| 久久综合综合久久狠狠狠97色88| 久久婷婷五月综合国产尤物app| 亚洲人成无码久久电影网站| 精品多毛少妇人妻AV免费久久| 丰满少妇人妻久久久久久| 久久综合给合久久狠狠狠97色69| 久久无码专区国产精品发布| 亚洲午夜精品久久久久久浪潮| 色99久久久久高潮综合影院| 伊人久久亚洲综合影院| 久久这里只有精品首页|