Re: [问题] 使用thread更慢的问题

楼主: Caesar08 (Caesar)   2016-03-30 17:23:06
原本要回你信,后来想说直接放版上好了,以便让其他人看(也让别人纠正自己的错误)
如果你仔细读
http://en.cppreference.com/w/cpp/thread/async
你就会发现如果是用launch::async,
"async executes the function f on a new thread of execution (with all thread-l
oc
也就是说他的执行会 像 直接construct thread一样
问题来了,这个像真的就会如同construct thread一样吗?
首先,需要先知道,每个CPU有最大能提供的threads数量(简称CPU threads)
而每个作业系统也有最大能提供的threads数量(简称OS threads)
如果在程式construct过多thread(如同你的arrayCount),有可能会导致system_error
,?
1. 你已经把所有OS threads都用完了
2. 你的OS有限制process能使用的threads数量
假设system_error的情况都没有,那你还会面对别的问题,context switch
一旦你的construct threads的数量大于CPU threads,就会需要context switch
context switch会增加程式执行时间,因为
1. 它减少每个threads能使用的时间
2. context switch本身就需要时间,而它成本不低
讲了那么多,那async可以做什么?
原因是async本身可以帮你解决掉context switch所产生的问题
(如果你是用launch::async|launch::deferred,那还可以解决system_error的问题)
虽然说async的行为 像 直接construct thread,但它内部如果只用固定N个threads轮流
执?
那他就不需要context switch,所以async可以更快
std::thread因为有提供native_handle,它可以做更多async做不到的事情(例如设定pri
or
(而且thread每次construct都需要system call,async可以用threadpool解决这问题)
如果你不需要用native_handle,那你就应该使用async
或是你可以自己写threadpool来使用(或是用intel TBB,感谢LiloHuang补充)
但我目前没看到有好的threadpool可以满足以下四点
1. exception safety
2. work stealing
3. pure C++
4. thread-safe(这看起来好像很基本,但github搜索threadpool第一页的
第3(nbsdx)与第5(tghosgor)的threadpool都没做到)
即便是我自己写的threadpool,目前1与2都没做到(1快做到了)
即使都做到了,也还有dynamic resize threadpool可以研究
另外,关于你说的
: 我想std::thread应该也是在new thread中执行, 但难道它是以同步的方式吗?
所有thread应该都算是asynchronous(异步)
但是asynchronous本来是用来形容IO的
你拿asynchronous形容thread的执行方式,好像怪怪的
作者: LiloHuang (十年一刻)   2016-03-30 18:08:00
Intel TBB library 本身就能满足你那四点MSVC 的 std::async 在 launch::async 是用 PPL 实作无论是 PPL 或者 TBB 都是 threadpool,后者弹性非常大TBB 强大于 parallelism functions (i.e. flow graph)用以实作各种复杂的 structured parallel patterns
作者: a2975313 (GN)   2016-04-04 02:40:00
MSVC使用PPL实作←这可以从哪边查到?所以比起thread, async提供一套管理(优化)平行处理的方式, 而thread并没有这套机制. 可以这样理解吗?
作者: LiloHuang (十年一刻)   2016-04-08 20:19:00
MSVC使用PPL这件事情你可以自己单步追踪,会发现是使用::Concurrency::create_task() 来建立一个 async task
作者: a2975313 (GN)   2016-04-09 18:34:00
除了动手trace, msdn或文件上是否有提到?
作者: LiloHuang (十年一刻)   2016-04-10 10:50:00
我不记得 MSDN 有提到,因为这算是内部实作的细节。如果怕实作在未来改变,就直接使用 PPL 或者 TBB。

Links booklink

Contact Us: admin [ a t ] ucptt.com