我们有一个很奇怪的问题,我们设法创造出一个很小的,可以复制的(在某些电脑上)例子:
main.cppDockerfile
这段代码毫无用处,它只记录了几行代码,但这几行代码证明它不能处理超过一个线程。
我们使用boost 1.70(asio1.14.0)
到目前为止,我做了3次计算:
我的台式机Ryzen 1950x64GB RAM的主要结果是:
started for 1 threads
Listener started on thread: 140593064609536
started for 2 threads
started for 3 threads
started for 4 threads
started for 5 threads
started for 6 threads
started for 7 threads
(有时2或3也能工作,但大多不行)
我在这台机器上测试了在Windows上使用msvc构建的版本,结果是运行良好,所以问题是linux+内核计数特定的。
主服务器2x E5-2630 v3 128 GB RAM主要以:
root@cf8c892390ce:/app/test/bin# ./test
started for 1 threads
Listener started on thread: 140062574507776
started for 2 threads
started for 3 threads
started for 4 threads
started for 5 threads
started for 6 threads
started for 7 threads
(超过100次测试中有一次2也起作用,但不会更多)
旧测试服务器2x旧intel 2核CPU 4 GB RAM大多数结果如下:
root@f06821a4cbc8:/app/test/bin# ./test
started for 1 threads
Listener started on thread: 140650646316800
started for 2 threads
Listener started on thread: 140650621138688
started for 3 threads
Listener started on thread: 140650246829824
started for 4 threads
Listener started on thread: 140650213259008
started for 5 threads
Listener started on thread: 140649944823552
started for 6 threads
Listener started on thread: 140649743496960
started for 7 threads
Listener started on thread: 140649726711552
(有时5、6或7个线程不工作)
我们在少数其他系统上进行了测试,只有一个线程工作可靠。
你能看看密码,告诉我这里有没有什么愚蠢的错误吗?,或者如果这是asio中的bug?
最重要的是我们能解决它吗?
最佳答案
您可能在实际工作发布之前启动事件循环(run()和相关的)。
这将允许服务在侦听器启动之前完成(一个竞争条件),这就解释了症状。
避免这种情况的通常方法是使用work<>
对象。
现在看看你的代码。
关于c++ - 在具有多核的机器上,使用boost asio仅可能有1个线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56704296/