在函数printprime中,我使用四个线程中的每个线程迭代每个元素,这几乎等同于单个线程程序。我想通过i = i + MAX_THREADS递增“i”。我使用四个线程,因为我的笔记本电脑有四个处理器,并且它已经完全优化。有人能告诉我如何调整printprime,以便每个线程迭代一个数字。就像,线程1检查2,6,10 ..... thread2检查3,7,11 ......等等。
#include<stdio.h>
#include<pthread.h>
#define N 30
#define MAX_THREADS 4
int prime_arr[N]={0};
void *printprime(void *ptr)
{
int j,flag;
int i=(int)(long long int)ptr;
for(i=2;i<N;i++){
flag=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
prime_arr[i]=1;
}
}
}
int main()
{
pthread_t tid[MAX_THREADS]=;
int count=0;
for(count=0;count<MAX_THREADS;count++)
{
printf("\r\n CREATING THREADS %d",count);
pthread_create(&tid[count],NULL,printprime,(void*)count);
}
printf("\n");
for(count=0;count<MAX_THREADS;count++)
{
pthread_join(tid[count],NULL);
}
int c=0;
for(count=0;count<N;count++)
if(prime_arr[count]==1)
printf("%d ",count);
return 0;
}
答案 0 :(得分:0)
通过i
(在您的情况下为4),在函数void *printprime(void *ptr)
中实现所需的增量变量MAX_THREADS
。
注意:行printf("Thread id[%d] checking [%d]\n",pthread_self(),i);
用于显示哪个线程正在检查哪个值。
以下代码可能会有所帮助:
#include<stdio.h>
#include<pthread.h>
#define N 30
#define MAX_THREADS 4
int prime_arr[N]={0};
void *printprime(void *ptr)
{
int j,flag;
int i=(int)(long long int)ptr;
while(i<N)
{
printf("Thread id[%d] checking [%d]\n",pthread_self(),i);
flag=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0 && (i>1))
{
prime_arr[i]=1;
}
i+=MAX_THREADS;
}
}
int main()
{
pthread_t tid[MAX_THREADS]={{0}};
int count=0;
for(count=0;count<MAX_THREADS;count++)
{
printf("\r\n CREATING THREADS %d",count);
pthread_create(&tid[count],NULL,printprime,(void*)count);
}
printf("\n");
for(count=0;count<MAX_THREADS;count++)
{
pthread_join(tid[count],NULL);
}
int c=0;
for(count=0;count<N;count++)
if(prime_arr[count]==1)
printf("%d ",count);
return 0;
}