boost :: asio :: io_service线程池正在运行相同线程ID上的所有代码

时间:2014-07-12 06:11:00

标签: c++ multithreading c++11 boost

我使用boost::asio::ioservice创建一个包含100个线程的线程池。

在while循环中,我想发布5个线程来完成这项工作:

void dowork(int i) {
    std::cout << "hello" << std::endl;
    cout << " thread ID :" << boost::this_thread::get_id();
}

然后我work.reset()

尽管线程池大小为100,但在发布时它没有占用5个线程。实际上,当我打印线程ID时,它对于所有5个线程都是相同的。

所以它没有并行执行......为什么会这样?

int main() {
    int ch;
    int i;
    boost::asio::io_service ioservice;
    boost::thread_group threadpool;

    auto_ptr<boost::asio::io_service::work> work(
         new boost::asio::io_service::work(ioservice)
    );

    for(i=0; i<100; i++) {
        threadpool.create_thread(
            boost::bind(&boost::asio::io_service::run, &ioservice)
        );
    }

    ch=0;
    while(ch <= 5) {
        ch++;
        cout << "in main" << boost::this_thread::get_id() << endl;
        for(i=0; i<5; i++) {
            ioservice.post(boost::bind(dowork,10));
        }
        std::cout << "size=" << threadpool.size() <<std::endl;
        work.reset();
        ioservice.reset();
        ioservice.run();
    }
}

1 个答案:

答案 0 :(得分:0)

仔细观察,第一批任务 在“池”的所有线程上执行。见 Live On Coliru

但是,在循环结束时,您重置了工作。这会导致所有线程退出 [¹] 。毫不奇怪,您的主线程将成为后续任务发布的唯一处理线程。

我建议不要让主线程在那里调用run()。此外,使用100个线程是(大)反模式。对于这么多工人来说,这是不寻常的。

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

boost::atomic_int tid_gen(0);

void dowork(int i) {
    thread_local int tid = ++tid_gen;
    std::cout << "hello";
    std::cout << " thread ID :" << tid << "\n";
}

int main() {
    boost::asio::io_service ioservice;
    boost::thread_group group;

    boost::optional<boost::asio::io_service::work> work(boost::asio::io_service::work{ioservice});

    for(size_t i=0; i<boost::thread::hardware_concurrency(); i++) {
        group.create_thread(
            boost::bind(&boost::asio::io_service::run, &ioservice)
        );
    }

    std::cout << "in main thread size=" << group.size() <<std::endl;

    for(int i = 0; i <= 5; ++i) {
        for(int i=0; i<5; i++) {
            ioservice.post(boost::bind(dowork,10));
        }

        boost::this_thread::sleep_for(boost::chrono::milliseconds(600));
        std::cout << "waking up\n";
    }

    work.reset(); // allow threads to exit
    group.join_all(); // await proper thread shutdown
}

查看 Live On Coliru


<强> [¹] 即可。 (事实上​​,如果你没有,线程仍将在程序退出时运行,导致未定义的行为)。