std::thread 的并发测试

这篇博客探讨了使用std::thread进行并发测试的情况,重点关注了两个方面:同步锁的最佳位置以提升效率,以及找出CPU相关性的最优线程数量。实验结果显示,同步锁的位置直接影响性能,推荐紧邻共享变量放置。同时,测试发现32线程在I5 7300HQ CPU上达到最佳性能,增加或减少线程数量并未显著改善耗时。
摘要由CSDN通过智能技术生成

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 线程长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值