[C/C++]C++多线程入门实例讲解

题目:三个线程,两个线程分别生成一个随机数,第三个线程计算和。


思路:

  1. 熟悉C++多线程的用法以及互斥锁的使用,此例好像不用加锁。
  2. 设置微秒级别的随机数种子。不然产生的两个随机数一样。

代码:

#include<iostream>
#include<windows.h>
#include<sys/timeb.h>  
#include<thread>
#include<mutex>

using namespace std;

int a, b;     //产生2个随机数
mutex mtx;    //定义mutex类的对象mtx构造互斥元,互斥占有一个变量,一段时间内仅一个线程可以访问
//声明初始化随机种子函数
void initRand();
//声明分支线程函数
void F1();
void F2();

int main()
{	
	thread thrd_1(F1);
	thread thrd_2(F2);
	thrd_1.join();
	thrd_2.join();	
	
	int sum=0;
	sum = a + b;
	return sum;
}

/* 初始化随机种子 */
void initRand()
{
	// 如果支持高性能精度计数器,则使用其初始化随机种子(微秒级)  #include<windows.h>
	LARGE_INTEGER nFrequency;
	if (QueryPerformanceFrequency(&nFrequency))
	{
		LARGE_INTEGER nStartCounter;
		QueryPerformanceCounter(&nStartCounter);
		srand((unsigned)nStartCounter.LowPart);
	}
	else // 否则使用当前系统时间初始化随机种子(毫秒级)  #include<sys/timeb.h> 
	{
		struct timeb stb;
		ftime(&stb);
		srand((unsigned)stb.millitm);
	}
}

void F1()  //产生随机数1
{
	/*std::lock_guard类模板,用于自动锁定解锁,直到对象作用域结束。
	在 lock_guard 对象构造时,传入的mutex对象 mtx 会被当前线程锁住。
	在lock_guard 对象被析构时,它所管理的mutex对象mtx会自动解锁*/
	lock_guard<mutex> mtx_locker(mtx);
	initRand();
	a = rand();
}

void F2() //产生随机数2
{
	lock_guard<mutex> mtx_locker(mtx);
	initRand();
	b = rand();
}

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值