调用线程并调用新程序primeThreads.c

Call a thread and call new program primeThreads.c

所以我在下面有一个程序 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);
}

以下建议代码:

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

现在,建议的代码:

#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 );
}

a 运行 提议的代码导致:

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