Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ asio::strand上的任务在单个线程上运行_C++_Asio_Stdasync - Fatal编程技术网

C++ 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

我使用来自的库的独立版本修改了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: 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