在C中使用多线程显示素数

时间:2017-07-03 09:13:30

标签: c multithreading primes

在函数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]=enter image description here;
 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;

 }

1 个答案:

答案 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;
 }