题目:三个线程,两个线程分别生成一个随机数,第三个线程计算和。
思路:
- 熟悉C++多线程的用法以及互斥锁的使用,此例好像不用加锁。
- 设置微秒级别的随机数种子。不然产生的两个随机数一样。
代码:
#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();
}
结果: