作者yhn0tgb60 (呦厚厚)
看板C_and_CPP
標題Re: [問題] 關於 boost asio 的 thread 問題
時間Wed Feb 3 23:44:10 2016
我的確是 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
→ Caesar08: thread不是越多越好。你的thread數量要跟CPU核心數相同 02/04 00:44
→ Caesar08: 才能有最大效能(也有人說要+1),否則只會降低速度 02/04 00:44
→ Caesar08: 過多的thread,會導致時間都花在switch上 02/04 00:49
跟CPU的核心數相同? 那不就是4核心 就開4個 thread?
那網路上找到很多說 可以開幾萬個 thread 是什麼意思???
還是說那幾萬個 thread 其實都一直在 switch ????
推 fr3ak: Boost 的部分的重點是 "may". Practically speaking, 我玩 02/04 01:03
→ fr3ak: 過的主流平台都不需要. With one notable exception, Asio 02/04 01:03
→ fr3ak: 的 async resolver 其實是 background thread 在 query, 再 02/04 01:03
→ fr3ak: 把結果 post 回對應的 io_service, 讓使用者 call io_servi 02/04 01:03
→ fr3ak: ce::run() 的 thread (worker thread) 把結果 dispatch 到 02/04 01:03
→ fr3ak: async resolve 的 user-specified handler 去處理. 不是說 02/04 01:03
→ fr3ak: 好不談特例了嗎? QQ 02/04 01:03
感謝.... 我會用無比的毅力 把英文看完!!!
→ fr3ak: 建議原 po 考慮從單純一點的東西開始. IMHO, 你把戰線拉太 02/04 01:06
→ fr3ak: 長了 02/04 01:06
我也有感覺還是先簡單一點好了 謝謝喔 XD
只是因為以前學生時代有寫過 winsock
想說都過了 5年了 該寫個比以前厲害的東西 XD
→ Caesar08: 的確可以開幾萬個thread,但你不應該這麼做。就好像你" 02/04 10:28
→ Caesar08: 可以"new memory卻不delete,但你不應該這麼做 02/04 10:28
→ Caesar08: 我以前以為越多thread越好,於是就create 4萬多個thread 02/04 10:36
→ Caesar08: 去執行,卻發現速度非常慢,後來才知道thread數量要跟 02/04 10:36
→ Caesar08: 核心數相同。如果你不知道核心數怎麼看,工作管理員那 02/04 10:37
→ Caesar08: 邊就有顯示了 02/04 10:37
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
→ Caesar08: 不過你要注意,他有可能會return 0 02/04 11:07