Re: [問題] 關於 boost asio 的 thread 問題

看板C_and_CPP作者 (呦厚厚)時間8年前 (2016/02/03 23:44), 8年前編輯推噓2(2019)
留言21則, 2人參與, 最新討論串2/2 (看更多)
我的確是 Network 和 Thread 的新手, 所以問題會很多 XD http://0rz.tw/XxYHm Threads and Boost.Asio Internal Threads The implementation of this library for a particular platform may make use of one or more internal threads to emulate asynchronicity. 內部 Threads 這個 library 在特定的平台, 會使用一個以上的內部 threads 去模擬 asynchronicity, 我因為這句話, 所以以為 boost 的非同步是用 multi threads 做到的, 不過 其實我英文很差..... 所以我沒有把整篇文章都看懂, 也許是我搞錯了.... 只有 post 是用到 multi threads??? 另外 nagle和 nopush(cork) 的意思, 就是 會等到封包大一點再送的意思??? 而 nagle 和 delay ack 一起時, 如果 write-write-read 時, 會遇到因為對方 ack 送不出去, 我收不到 ack, 所以後面的封包也不能送的問題, 造成最多大約 40ms(0.04s) 的 delay, nopush 和 nagle 的差別 , 在於封包的大小, nopush 是 MTU, 一般系統預設是 1500Byte, nagle 是 MMS, 一般系統預設是 536Byte, 不過他們也都有時間的限制, 200ms(0.2s)後 就算沒有達到封包的大小, 還是會送出去, 希望以上我的理解沒錯 XD 所以 不建議做 batch 的原因, 是同時送封包, 會因為 ack 的問題, 送不出去嗎??? 讓他自由的寄收, 比較能避免 ack 塞住的問題???? 其實我也有想過 如果我每個使用者都一個 Thread, 那就不用 asynchronicity, 用 synchronicity 就好了???? 只是感覺 asynchronicity 好像就比較厲害 看大家都用這個 XD 而且我擔心 Thread 會出什麼問題(我也不知道會出什麼問題), 如果我又用 synchronicity, 會不會系統就突然卡死住, 關於 multi thread, 我用 C++11, 我打算一開始就先開 1000的 thread 預備, 根據不同系統, thread 數的上限不同, 但好像至少都有好幾萬????? 不知道用爆了會發生什麼事..... 開了之後, 所有的需要的東西的 tick 都會向 thread pool 註冊, 包括 socket 和 每個使用者 和其他需要的東西, 每個 thread 在初期都是鎖住的, 會有個 main thread 負責分配工作, 每分配一個工作, 就對一個 thread 解鎖, 每個 thread 事情做完後, 就會再鎖住, main thread 發現所有工作都分配完, 且 thread 又都鎖住時, 就會進入下一個tick, 再開始分配工作, 其實我不知道這樣行不行, 我正在寫當中, 先試試再說 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.169.16 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1454514253.A.693.html

02/04 00:44, , 1F
thread不是越多越好。你的thread數量要跟CPU核心數相同
02/04 00:44, 1F

02/04 00:44, , 2F
才能有最大效能(也有人說要+1),否則只會降低速度
02/04 00:44, 2F

02/04 00:49, , 3F
過多的thread,會導致時間都花在switch上
02/04 00:49, 3F
跟CPU的核心數相同? 那不就是4核心 就開4個 thread? 那網路上找到很多說 可以開幾萬個 thread 是什麼意思??? 還是說那幾萬個 thread 其實都一直在 switch ????

02/04 01:03, , 4F
Boost 的部分的重點是 "may". Practically speaking, 我玩
02/04 01:03, 4F

02/04 01:03, , 5F
過的主流平台都不需要. With one notable exception, Asio
02/04 01:03, 5F

02/04 01:03, , 6F
的 async resolver 其實是 background thread 在 query, 再
02/04 01:03, 6F

02/04 01:03, , 7F
把結果 post 回對應的 io_service, 讓使用者 call io_servi
02/04 01:03, 7F

02/04 01:03, , 8F
ce::run() 的 thread (worker thread) 把結果 dispatch 到
02/04 01:03, 8F

02/04 01:03, , 9F
async resolve 的 user-specified handler 去處理. 不是說
02/04 01:03, 9F

02/04 01:03, , 10F
好不談特例了嗎? QQ
02/04 01:03, 10F

02/04 01:04, , 11F
02/04 01:04, 11F
感謝.... 我會用無比的毅力 把英文看完!!!

02/04 01:06, , 12F
建議原 po 考慮從單純一點的東西開始. IMHO, 你把戰線拉太
02/04 01:06, 12F

02/04 01:06, , 13F
長了
02/04 01:06, 13F
我也有感覺還是先簡單一點好了 謝謝喔 XD 只是因為以前學生時代有寫過 winsock 想說都過了 5年了 該寫個比以前厲害的東西 XD

02/04 10:28, , 14F
的確可以開幾萬個thread,但你不應該這麼做。就好像你"
02/04 10:28, 14F

02/04 10:28, , 15F
可以"new memory卻不delete,但你不應該這麼做
02/04 10:28, 15F

02/04 10:36, , 16F
我以前以為越多thread越好,於是就create 4萬多個thread
02/04 10:36, 16F

02/04 10:36, , 17F
去執行,卻發現速度非常慢,後來才知道thread數量要跟
02/04 10:36, 17F

02/04 10:37, , 18F
核心數相同。如果你不知道核心數怎麼看,工作管理員那
02/04 10:37, 18F

02/04 10:37, , 19F
邊就有顯示了
02/04 10:37, 19F
http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency std::thread::hardware_concurrency() 可以用這function 來參考吧 之前用這個試的時候 回傳4 讓我很疑惑 我的電腦只能開 4個 thread ??? 為什麼網路上大家都說可以開幾萬個??? 現在終於懂了 ※ 編輯: yhn0tgb60 (220.132.169.16), 02/04/2016 10:58:09

02/04 11:07, , 20F
不過你要注意,他有可能會return 0
02/04 11:07, 20F

02/05 13:34, , 21F
對於 background thread 的官方說法 http://goo.gl/JsL7ts
02/05 13:34, 21F
文章代碼(AID): #1MiY1DQJ (C_and_CPP)
文章代碼(AID): #1MiY1DQJ (C_and_CPP)