gpt4 book ai didi

c++ - 使用 asio : Threads randomly don't execute boost 线程池

转载 作者:行者123 更新时间:2023-11-30 01:19:37 24 4
gpt4 key购买 nike

我正在使用基于 boost::asio::ioService 的线程池。但是,线程有时不会执行发布到 ioService 的工作。

我构建了以下最小示例来对此进行调查:

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <iostream>

#include "threadpool.h"

int fib(int x) {
if (x == 0) return 0;
if (x == 1) return 1;
return fib(x-1)+fib(x-2);
}

void doSomething(int value)
{
std::cout << "doSomething(): " << fib(value) << std::endl;
}

void doSomethingElse(int value)
{
std::cout << "doSomethingElse(): " << value+value << std::endl;
}

int main(int argc, char** argv)
{
// create asio ioservice and threadgroup for the pool
boost::asio::io_service ioService;
boost::thread_group threadpool;

// Add worker threads to threadpool
for(int i = 0; i < 5; ++i)
{
threadpool.create_thread(
boost::bind(&boost::asio::io_service::run, &ioService));
}

// post work to the ioservice
ioService.post(boost::bind(doSomething, 40));
ioService.post(boost::bind(doSomethingElse, 3));

// run the tasks and return, if all queued work is finished
ioService.run();

// join all threads of the group
threadpool.join_all();
}

如果我像这样在循环中运行它:

while true; do echo "--------------"; ./boost_threadpool_test; done

我会得到类似这样的输出:

--------------
doSomething(): 102334155
doSomethingElse(): 6
--------------
--------------
--------------
--------------
doSomething(): 102334155
doSomethingElse(): 6
--------------
--------------
--------------
doSomething(): 102334155
doSomethingElse(): 6
--------------
--------------
doSomething(): 102334155
doSomethingElse(): 6
--------------
--------------
--------------
--------------
--------------
--------------
doSomething(): 102334155
doSomethingElse(): 6
--------------

所以连续 2 行或更多行表明线程还没有处理它们的工作。我还尝试了自己的线程池实现,只是使用 boost threadgroup 来切断 IOService,但结果相似。我在这里弄错了一些基本的东西吗?

顺便说一句:我在使用 Boost 1.46.1

最佳答案

您调用 io_service::run(),但不提供 any workio_service,所以 run() just exits .现在您必须在任何后续 run() 之前调用 io_service::reset()

它有时工作的事实是由于竞争条件:ioService.post(boost::bind(doSomething, 40)) 可能在线程(s)之前在主线程中执行) 在你的池中开始,从而给 io_service 一些工作。

关于c++ - 使用 asio : Threads randomly don't execute boost 线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com