LZ 受命使用多线程提高某个程序的运行效率。原来程序的行为大概是 step0,step1,step2 之后回到 step0 ,循环若干次。LZ 把 step1 和 step2 的一部分流程并行化,开了三个后台线程做消费者,主线程把任务放在队列里面,消费者线程拿取之后运行,运行完毕后主线程继续。代码如下:
```
std::vector<std::future<void>>futures;
for(auto npg:m_NPGs){
futures.emplace_back(ThreadPoolSingleton::getNPCInstance(threadNum.getValue()).enqueue([this,npg]() {
npg->cycleStep1();
}));
}
for(auto &k:futures){
k.wait();
}
```
线程池代码如下:
```
inline ThreadPool::ThreadPool(size_t threads)
: stop(false)
{
for(size_t i = 0;i<threads;++i)
workers.emplace_back(
[this]
{
for(;;)
{
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queue_mutex);
this->condition.wait(lock,
[this]{ return this->stop || !this->tasks.empty(); });
if(this->stop && this->tasks.empty())
return;
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
}
);
}
```
然而出乎楼主预料的是,使用多线程之后性能不增反降,进一步分析发现没有使用多线程优化的 step0 的用时相较之前有着明显增加,幅度达到了单线程时的两倍。火焰图上看,step0 期间调用的每个函数用时增长幅度大致相当。
单线程时,用时分别为:t0=2s, t1=5.58s, t2=10s 多线程时,用时为:t0=3.97s t1=9.3s t2=10.4s
楼主现在不理解的是,step0 看起来和我的多线程优化没有任何关系,在 step0 运行时,三个后台线程应该都在被 condition_variable 阻塞。为什么用时会增加呢?
楼主运行环境为多人共用的 linux 服务器,100 多个空闲核心,开三个后台线程应该不会有什么影响。
```
std::vector<std::future<void>>futures;
for(auto npg:m_NPGs){
futures.emplace_back(ThreadPoolSingleton::getNPCInstance(threadNum.getValue()).enqueue([this,npg]() {
npg->cycleStep1();
}));
}
for(auto &k:futures){
k.wait();
}
```
线程池代码如下:
```
inline ThreadPool::ThreadPool(size_t threads)
: stop(false)
{
for(size_t i = 0;i<threads;++i)
workers.emplace_back(
[this]
{
for(;;)
{
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queue_mutex);
this->condition.wait(lock,
[this]{ return this->stop || !this->tasks.empty(); });
if(this->stop && this->tasks.empty())
return;
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
}
);
}
```
然而出乎楼主预料的是,使用多线程之后性能不增反降,进一步分析发现没有使用多线程优化的 step0 的用时相较之前有着明显增加,幅度达到了单线程时的两倍。火焰图上看,step0 期间调用的每个函数用时增长幅度大致相当。
单线程时,用时分别为:t0=2s, t1=5.58s, t2=10s 多线程时,用时为:t0=3.97s t1=9.3s t2=10.4s
楼主现在不理解的是,step0 看起来和我的多线程优化没有任何关系,在 step0 运行时,三个后台线程应该都在被 condition_variable 阻塞。为什么用时会增加呢?
楼主运行环境为多人共用的 linux 服务器,100 多个空闲核心,开三个后台线程应该不会有什么影响。

