trace了一下, launch::deferred|launch::async模式下
确实可以跑到::Concurrency::create_task, 但它是使用整套的PPL(含threadpool)
还是局部的PPL功能? http://imgur.com/PFSbkJd
查了一下, PPL是Microsoft Concurrency Runtime中的其中一块
https://msdn.microsoft.com/en-us/library/ee207192.aspx
那linux下的std::async是使用什么机制? 跟windows一样吗?
会这么问, 是因为std开头的应该是standard library, 是否会因为os而有改变?
※ 引述《Caesar08 (Caesar)》之铭言:
: 原本要回你信,后来想说直接放版上好了,以便让其他人看(也让别人纠正自己的错误)
: 如果你仔细读
: 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的执行方式,好像怪怪的