【问题标题】:Call a thread and call new program primeThreads.c调用一个线程并调用新程序 primeThreads.c
【发布时间】:2020-11-27 13:57:19
【问题描述】:

所以我在下面有一个程序 prime.c,我应该通过让每个素数调用一个线程并这样调用新程序 primeThreads.c 来加速它:

 > gcc –o prime prime.c –lm
 > time ./prime
 >gcc –o primeThreads primeThreads.c –lm –lpthread
 >time ./primeThread

我只是有点困惑如何做到这一点?我应该在 primeThreads.c 中创建线程然后调用它吗?另外我如何从 prime.c 调用这个文件?我尝试在下面的 prime.c 中创建线程并

/tmp/cc8Lo90g.o: In function `main':
prime.c:(.text+0xa7): undefined reference to `pthread_create'
prime.c:(.text+0xb8): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status

prime.c

#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <pthread.h>

void *prime(void*);

int main() 
{
  int i;
  pthread_t t1;

  long int number[10] = {5011*5009, 1293961, 1293967, 5021*4241, 4723*5009, 
                         5011*5021, 1299173, 1160807, 4241*4723, 1161829};

  for (i = 0; i < 10; i++) {
    prime(number+i);
        pthread_create(&t1, NULL, prime, " ");
        pthread_join(t1, NULL);  
  } 

  return(0);
}


void *prime(void *n) {
  int i;
  long int num = *((long int *)n);
  int max = (int) sqrt(num);
  for (i = 2; i <= max; i++) {
    usleep(1000);
    if (num % i == 0) {
      printf("%ld is not prime\n", num);
      return NULL;
    }
  }
  printf("%ld is prime\n", num);
}

【问题讨论】:

    标签: c multithreading compiler-errors pthreads primes


    【解决方案1】:

    以下建议的代码:

    1. 干净编译
    2. size_t 用于永远不会是的变量
    3. 将变量i 的范围限制为封闭的for() 语句
    4. 允许编译器确定number[] 表中的条目数
    5. 消除了“神奇”数字10
    6. 消除了usleep( 1000 ) 的延迟
    7. 删除了未使用的头文件:unistd.h
    8. pthread_t tl 更改为一个数组,以便于使用pthread_join(),因此可以同时存在多个线程
    9. 插入适当的水平间距以提高可读性
    10. 注意:使用可变宽度字体时,缩进宽度为 2 可能会“丢失”,因此将所有缩进宽度更改为 4 个空格
    11. 注意:向“内存受限”程序添加线程不会使程序更快。

    现在,建议的代码:

    #include <stdio.h>
    #include <math.h>
    #include <pthread.h>
    
    void *prime( void* );
    
    int main( void ) 
    {
        long int number[] = {5011*5009, 1293961, 1293967, 5021*4241, 4723*5009, 
                             5011*5021, 1299173, 1160807, 4241*4723, 1161829};
    
        pthread_t t1[ sizeof(number)/sizeof(number[0]) ];
    
        for ( size_t i = 0; i < (sizeof(number)/sizeof(number[0])); i++) 
        {
            pthread_create( &t1[i], NULL, prime, (void*)(number+i) );  
        } 
    
        for( size_t i = 0; i < (sizeof(number)/sizeof(number[0])); i++ )
        {
            pthread_join( t1[i], NULL ); 
        }
        return(0);
    }
    
    
    void *prime( void *n ) 
    {
        size_t num = *((size_t *)n);
        size_t max = (size_t) sqrt((double)num);
      
        for ( size_t i = 2; i <= max; i++ ) 
        {
            if ( num % i == 0 ) 
            {
                printf( "%ld is not prime\n", num );
                pthread_exit( NULL );
            }
        }
    
        printf( "%ld is prime\n", num );    
        pthread_exit( NULL );
    }
    

    运行建议的代码会导致:

    25100099 is not prime
    1293961 is prime
    1293967 is prime
    21294061 is not prime
    1299173 is prime
    25160231 is not prime
    20030243 is not prime
    1160807 is prime
    23657507 is not prime
    1161829 is prime
    

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2019-07-11
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多