#include"c/myinc.h"
#define MAXYZ 20
pthread_mutex_t mutex;
int ym=0; //因子 nums
int ya[MAXYZ];
int n;
int tmp;
void* testYZ(void *arg){
while(1){
pthread_mutex_lock(&mutex);
printf("id: %lu, tmp: %d\n",pthread_self(), tmp);
if(tmp>0){
if(n%tmp==0){
ya[ym]=tmp;
ym++;
}
tmp--;
}else{
pthread_mutex_unlock(&mutex);
break;
}
pthread_mutex_unlock(&mutex);
usleep(300000);
}
// printf("id: %lu, ends\n",pthread_self());
return (void*)0;
}
int main(int argc, char **argv){
if(argc!=3){
err_exit("argc error");
}
n=atoi(argv[1]); //check if n is a wanquanshu
tmp=n-1;
int p=atoi(argv[2]); // thread nums
pthread_t th;
// printf("thread nums: %d\n", p);
int i=0;
int j=0;
int retcode;
for(i=0;i<p;i++){
retcode=pthread_create(&th, NULL, testYZ, NULL);
if(retcode!=0){
err_exit("th create error");
}
}
pthread_join(th,NULL);
int sum=0;
for(i=0;i<ym;i++){
printf("%d ",ya[i]);
sum+=ya[i];
}
printf("\n");
if(sum==n){
printf("是完全数\n");
}else{
printf("不是完全数\n");
}
return 0;
}
测试数据: 6和28是完全数
题目:第二章课后习题64:
从命令行读取数字N和P创建P个线程,将1~N这N个数分给各个线程,保证两个线程不会分到相同的数。线程判断这些树是不是N的因数,如果是,那么放到一个共享的缓冲区中。在父进程中用合适的同步方法等待所有的线程执行完毕后,判断N是否是完全数。