Re: [问题] 关于 boost asio 的 thread 问题

楼主: yhn0tgb60 (呦厚厚)   2016-02-03 23:44:10
我的确是 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
作者: Caesar08 (Caesar)   2016-02-04 00:44:00
thread不是越多越好。你的thread数量要跟CPU核心数相同才能有最大效能(也有人说要+1),否则只会降低速度过多的thread,会导致时间都花在switch上
作者: fr3ak (fr3@K)   2016-02-04 01:03:00
Boost 的部分的重点是 "may". Practically speaking, 我玩过的主流平台都不需要. With one notable exception, Asio的 async resolver 其实是 background thread 在 query, 再把结果 post 回对应的 io_service, 让使用者 call io_service::run() 的 thread (worker thread) 把结果 dispatch 到async resolve 的 user-specified handler 去处理. 不是说好不谈特例了吗? QQ另, https://goo.gl/7qrC07建议原 po 考虑从单纯一点的东西开始. IMHO, 你把战线拉太长了
作者: Caesar08 (Caesar)   2016-02-04 10:28:00
的确可以开几万个thread,但你不应该这么做。就好像你"可以"new memory却不delete,但你不应该这么做我以前以为越多thread越好,于是就create 4万多个thread去执行,却发现速度非常慢,后来才知道thread数量要跟核心数相同。如果你不知道核心数怎么看,工作管理员那边就有显示了不过你要注意,他有可能会return 0
作者: fr3ak (fr3@K)   2016-02-05 13:34:00
对于 background thread 的官方说法 http://goo.gl/JsL7ts

Links booklink

Contact Us: admin [ a t ] ucptt.com