• <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>

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開源項(xiàng)目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

            Asio的架構(gòu):Boost.Asio 設(shè)計(jì)索引

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

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

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

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

            這里是另外一個(gè)區(qū)別:boost.asio庫學(xué)習(xí)筆記—— receive和read的區(qū)別

             

            從服務(wù)器連接過來的客戶端的地址:

            std::string endpoint = socket.remote_endpoint( ).address( ).to_string();

            以下是對(duì)這篇文章的翻譯:

            asio chat_client.cpp中的一些問題

            1. 有多少個(gè)線程在運(yùn)行2個(gè),還是3個(gè)?

            >一般來說,依賴于運(yùn)行的平臺(tái),從程序的角度來說是2個(gè),包括:

            *主線程,用于處理用戶的輸入輸出

            *io_service.run()線程,用于處理chat_client對(duì)象中的所有行為(action)

            還有,async_write會(huì)創(chuàng)建一個(gè)線程或者其他的一些東西么?

            >不會(huì).

            2. 有關(guān)1的問題,為什么write函數(shù)使用post直接調(diào)用?什么不調(diào)用async_write?既然調(diào)用了post,你只是將其放到一個(gè)隊(duì)列里在同一線程處理,為什么之后還要從其他線程調(diào)用async_write?

            chat_client的成員對(duì)象不是線程安全的(故意?),因此要同步處理這些成員。如果直接從主線程調(diào)用async_write不是線程安全的,因?yàn)榇藭r(shí)可能有后臺(tái)線程正在訪問socket。

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

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

            在這個(gè)例子里是很困難的,因?yàn)橹骶€程正在阻塞等待用戶信息。不過如果你想將事件在線程間傳遞,確實(shí)可以為每個(gè)線程配備一個(gè)io_services。

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

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

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

            因?yàn)橹骶€程需要阻塞等待用戶信息,因此io_service::run是唯一需要的。如果你的程序不需要這樣做,那么就不需要其他線程,也就只需要簡(jiǎn)單的調(diào)用io_service::run()就可以了,這也是大多數(shù)例子這樣做的原因

             

            有關(guān)線程安全的問題

            1. 對(duì)于asio對(duì)象,能從2個(gè)不同線程調(diào)用一個(gè)共享對(duì)象的不同成員么?

            不能

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

            是的

            只有被標(biāo)記為 “共享對(duì)象:安全”的對(duì)象才能從不同線程同時(shí)訪問,io_service就是這樣的對(duì)象

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

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

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

            3. asio有很多成員函數(shù),我怎么知道哪些能安全的調(diào)用?

            一般情況下,你應(yīng)該認(rèn)為沒有任何一個(gè)函數(shù)是安全的,以下是通用的io線程安全判斷用例:

            write+write:不安全

            read+write:不安全

            read+read:安全

            asio對(duì)象已經(jīng)符合這種需求

             

            這里有一篇介紹io_service眾多區(qū)別及包處理,拆包等的技術(shù)

            久久夜色精品国产www| 99久久精品免费看国产一区二区三区| 日韩欧美亚洲综合久久影院Ds| 国产人久久人人人人爽| 国产偷久久久精品专区| 久久综合久久鬼色| 欧美精品丝袜久久久中文字幕| 亚洲精品国产成人99久久| 69SEX久久精品国产麻豆| 99久久99这里只有免费费精品| 久久精品国产99久久无毒不卡| 99精品国产综合久久久久五月天| 欧美久久久久久| 亚洲精品无码久久久久去q| A级毛片无码久久精品免费| 亚洲精品乱码久久久久久 | 色综合久久久久无码专区| 丁香色欲久久久久久综合网| 狠狠综合久久AV一区二区三区| 亚洲精品白浆高清久久久久久 | 国产精品无码久久久久| 久久99精品久久久久久水蜜桃| 亚洲欧美日韩久久精品| 狠狠色噜噜色狠狠狠综合久久| 久久99精品国产自在现线小黄鸭| a级成人毛片久久| 亚洲v国产v天堂a无码久久| 久久这里只有精品首页| 久久久久久午夜成人影院 | 亚洲伊人久久成综合人影院 | 久久九九亚洲精品| 亚洲国产精品综合久久一线| 国产亚洲精品久久久久秋霞| 久久国产一区二区| 一本一本久久a久久精品综合麻豆| 久久久一本精品99久久精品88| 久久综合久久综合九色| 久久天天躁夜夜躁狠狠躁2022 | 久久精品亚洲精品国产色婷| 精品99久久aaa一级毛片| 亚洲国产精品无码久久久秋霞2|