实现多线程程序测试一个数是否是完全数
实现一个多线程程序测试一个数是否是完全数。如果一个数N的所有因数(不包括N本身)的和还是N,则N是一个完全数,如6和28,输入是一个整数N,如果N是完全数则输出true,否则输出false。主程序从命令行读取数字N和P,创建P个线程,将1~N这N个数分给各个线程,保证两个线程不会分到相同的数。每个线程判断这些树是不是N的因数,如果是,那么放到一个共享的缓冲区中。在父进程中用合适的同步方法等待所有的线程执行完毕后,判断N是否是完全数,即判断是否N的所有因数之和还是N(提示:你可以将测试的数限定在1至N的平方根来加速计算过程。)
题目来自操作系统的课后习题。
#include <iostream>
#include <thread>
using namespace std;
int sum = 0;
void Is_yinshu(int N,int low,int up)
{
if (low <= 0)
{
cout << "下限不能小于0" << endl;
return;
}
for (int i = low; i <= up; i++) {
if (N % i == 0)
{
cout << i << "是" << N << "的因数" << endl;
sum += i;
}
}
}
int main()
{
int N, P;
cout << "请输入正整数N和P:";
cin >> N >> P;
thread* ptr = new thread[P];
if (N/2 <= P)//需要处理的数,小于所开线程
{
for (int i = 0; i < N/2; i++)
{
ptr[i] = thread(Is_yinshu,N, i+1, i+1);
}
}
else
{
int flag = N / 2 / P;
for (int i = 0; i < P-1; i++)//可能涉及到不能均等分配,前P-1个先分配
{
ptr[i] = thread(Is_yinshu,N, i*flag+1, i*flag+flag);
}
ptr[P - 1] = thread(Is_yinshu, N,(P-1) * flag+1, N / 2);
}
for (int i = 0; i < P; i++)
{
if (ptr[i].joinable()) {
ptr[i].join();
};
}
delete[] ptr;
cout << endl;
if (sum == N) cout << N<<"是完全数"<<endl;
else cout << N << "不是完全数"<<endl;
return 0;
}
新手上路,请多多指教。