C++ asio::strand上的任务在单个线程上运行
我使用来自的库的独立版本修改了asio strand示例 我的问题是,我是否需要配置串以使任务扩展到所有线程?或者我错过了什么 [编辑] 理想情况下,输出应该是C++ asio::strand上的任务在单个线程上运行,c++,asio,stdasync,C++,Asio,Stdasync,我使用来自的库的独立版本修改了asio strand示例 我的问题是,我是否需要配置串以使任务扩展到所有线程?或者我错过了什么 [编辑] 理想情况下,输出应该是 [00154F88] The program will exit when all work has finished. [001532B0] Thread Start [00154FB0] Thread Start [001532B0] x: 1 [00154FB0] x: 2 [001532B0] x: 3 [00154FB0] x
[00154F88] The program will exit when all work has finished.
[001532B0] Thread Start
[00154FB0] Thread Start
[001532B0] x: 1
[00154FB0] x: 2
[001532B0] x: 3
[00154FB0] x: 4
[001532B0] x: 5
[00154FB0] Thread Finish
[001532B0] Thread Finish
Press any key to continue . . .
在预期输出中,线程00154FB0
和001532B0
执行printum(),但在修改后的版本中,只有一个线程执行PrintNum()
如果未使用钢绞线,则输出为:
[140565152012096] section 4 started ...
[140565133883136] Started...
Task size 3
[140565117097728] Started...
[140565125490432] Started...
[[140565133883136] [140565117097728]] 12
3
[140565133883136] [4
[140565117097728140565125490432] 6
] 5
[140565133883136] 7
[140565125490432] 8
[140565117097728] 9
[140565125490432] End
[140565117097728] End
[140565133883136] End
谢谢
这是我正在使用的机器的cpu信息
$lscpu
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
操作系统是Ubuntu 18.04
Rong这就是a的目的:
串被定义为事件处理程序的严格顺序调用(即没有并发调用)。使用串允许在多线程程序中执行代码,而无需显式锁定(例如使用互斥锁)
如果您想要并行调用,您需要删除串,post()
直接到io\u服务
并从多个线程中调用io\u服务::run
(您已经这样做了)
一个不相关的注释:传递唯一指针没有意义;让您的生活更轻松,只需传递原始指针或引用。My understand is unique\u ptr应该几乎为零成本~对吗?我的理解是,io_服务应该以相同的顺序运行PrintNum,但要跨不同的线程运行,这在原始文章中也有解释。虽然那篇文章很旧。asio实现可能会随着时间的推移而改变。当链被移除时,我更新了输出。明白了吗,你说的代码越少越好:)来自你的链接文章:工作仍将串行执行,但它将通过当时可用的工作线程执行。Serially是指一次一个线程。我想说,在我的情况下还有两个线程可用。因为所有线程都已启动。在链接的文章中,链穿过两条线。我复制了输出。线程
00154FB0
和001532B0
都在调用函数PrintNum()在本文中,Serially’的顺序与函数推入串的顺序相同。我知道strand不能保证在所有三个线程中运行所有任务。但是,在一个线程中运行所有任务会使整个io_服务和串东西完全没有意义,对吗?
[140565152012096] section 4 started ...
[140565133883136] Started...
Task size 3
[140565117097728] Started...
[140565125490432] Started...
[[140565133883136] [140565117097728]] 12
3
[140565133883136] [4
[140565117097728140565125490432] 6
] 5
[140565133883136] 7
[140565125490432] 8
[140565117097728] 9
[140565125490432] End
[140565117097728] End
[140565133883136] End
$lscpu
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1