【问题标题】:Display the prime numbers using multi-threading in C在 C 中使用多线程显示素数
【发布时间】:2017-12-06 11:59:27
【问题描述】:

在函数 printprime 中,我用四个线程中的每一个对每个元素进行迭代,这几乎相当于一个单线程程序。我想将“i”增加 i=i+MAX_THREADS。我正在使用四个线程,因为我的笔记本电脑有四个处理器,并且已经过全面优化。有人可以告诉我如何调整 printprime 以便每个线程迭代一个数字。比如,线程 1 检查 2,6,10 ......线程 2 检查 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]={{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;

 }

【问题讨论】:

  • 在使用 200 个线程之前,不要循环直到 for(j=2;j&lt;=i/2;j++)use for(j=2;j&lt;=int(sqrt(i));j++) 并且你会节省一些 CPU ......这也不是最有效的方法:erathhostenes 筛子可能会感兴趣你。
  • 如果你声明一个函数返回一些东西,那么你实际上应该从函数返回一些东西,否则你将有未定义的行为。只需在线程函数末尾添加return NULL 就足够了。
  • 此外,为了获得最大的可移植性和标准 C 合规性,通过intptr_t 将参数类型转换为线程函数。喜欢(void *) (intptr_t) count时拨打pthread_create;还有i = (int) (inptr_t) ptr在线程函数里面。
  • 我实际上想知道如何确保每个线程只访问 prime_arr 的一个元素并且也访问一次。在上面的代码中,每个线程访问每个元素。这意味着每个元素都要经过严格的皮毛时间审查。
  • 如果编译时带有严格的警告会发生什么?例如。 gcc -Wall。考虑只检查 sqrt(i)(向上取整),而不是通过检查 unitl (i/2) 来浪费性能。这可能比通过多线程可以实现的任何东西都更有好处,至少对于大 N 而言。可能在 Erathostenes 之上。

标签: c multithreading primes


【解决方案1】:

为了达到理想的效果,请将函数 void *printprime(void *ptr) 中的变量 i 增加 MAX_THREADS(在您的情况下为 4)。

注意: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;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2021-11-19
    • 2012-05-01
    • 1970-01-01
    • 2020-12-02
    • 2011-10-06
    相关资源
    最近更新 更多