我使用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();
}
}
答案 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
}
<强> [¹] 即可。 (事实上,如果你没有,线程仍将在程序退出时运行,导致未定义的行为)。