std::thread 的并发测试,测试两方面的性能:
1 并发同步锁的最优位置
2 并发最优线程数量
直接上代码:
void Ticket::Sell(const int tickets)
{
this->tickes = tickets;
clock_t start, end;
start = clock();
vector<std::thread> threadLst;
for (int i = 0; i < 36; ++i)
{
threadLst.push_back(std::thread(&Ticket::Minus, this));
}
for (int i = 0; i < threadLst.size(); ++i)
{
threadLst[i].detach();
}
std::thread trd([=, &end]() {
while (tickes > 0)
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
end = clock();
});
trd.join();
char duration[255] = { 0 };
std::cout << "All time used : " << _itoa(end - start, duration, 10) << endl;
}
上文实现高并发线程的创建及完成所需时间。
void Ticket::Minus()
{
while (true)
{
if (tickes > 0)
{
std::lock_guard<std::mutex> locker(mutex);
if (tickes > 0) {
cout << GetCurrentThreadId() << " sell " << tickes-- << endl;
}
else
{
break;
}
}
else
{
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
线程执行的函数,实现常量的递减,直到为0.
Ticket ticket;
ticket.Sell(100000);
本次测试压力值为10000,CPU为I5 7300HQ。经测试:
1 同步锁std::lock_guard<std::mutex> locker(mutex)的位置 不同,效率差N倍,有兴趣的可进行验证。推荐紧挨着操作的共享变量。
2 线程数量不是越多越好,而是和CPU有一定的关系,百度无搜索到具体实例,还未研究透,反正和CPU有某种公式类关系就是了,大神经过的时候,还望不吝赐教。本案例32线程 达到最优,线程数量再增多64-200都 和32线程耗时差不多。线程数量 < 32,测试过24,16 等耗时都比32 线程长。