使用多个线程计算素数

时间:2012-10-18 00:21:56

标签: c multithreading

我正在尝试理解线程。我试图让多个线程计算素数。我想要一个线程来计算第一个数字,然后让下一个线程计算下一个数字,然后等到那个线程找到主要打印它。

所以,从1到50开始。将一个新数字传递给一个新线程。我认为这就是我们想要的。

到目前为止我所拥有的。

void* compute_prime (void* arg)
{
//pthread_mutex_lock(&lock);
int candidate = 2;
int n = *((int*) arg);

while (1) {
int factor;
int is_prime = 1;

/* Test primality by successive division.  */
for (factor = 2; factor < candidate; ++factor)
  if (candidate % factor == 0) {
    is_prime = 0;
    break;
  }
/* Is this the prime number we're looking for?  */
if (is_prime) {
  if (--n == 0)
    /* Return the desired prime number as the thread return value.  */

    return (void*) candidate;
}
++candidate;
}

return NULL;
}




int main ()
{
int which_prime = 50;
int isPrime1, isPrime2, isPrime3, isPrime4;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
for(master_list; master_list < which_prime; master_list++)
{
//do{

// pthread_mutex_lock(&lock); 

pthread_create (&thread1, NULL, &compute_prime, &master_list);
//master_list++;
//pthread_mutex_unlock(&lock);

//}while(master_list < which_prime);

}

return 0;
}

我的输出。

main thread pid is 508
Thread1 Found the prime number:  3.
Thread2 Found the prime number:  3.
Thread3 Found the prime number:  3.
Thread4 Found the prime number:  3.
Thread1 Found the prime number:  7.
Thread2 Found the prime number:  7.
Thread3 Found the prime number:  7.
Thread4 Found the prime number:  7.
Thread1 Found the prime number:  13.
Thread2 Found the prime number:  13.
Thread3 Found the prime number:  13.
Thread4 Found the prime number:  13.

等...

这有点像我想要的。但并非每个线程都应该找到相同的素数。他们应该找到不同的素数。即使我在线程之前增加变量它仍然无法工作。我评论了我试图让它工作的代码。我需要做什么?我希望我很清楚。

2 个答案:

答案 0 :(得分:1)

枚举素数不是令人难以置信的并行,这意味着将问题分解为独立计算并非易事。筛分和试验部门需要(或至少大大改善)以前的素数历史。

我确信有关于并行素数计算主题的认真研究。我不建议你依靠probabilistic prime test,你可以在很多数字上并行运行。这将极大地过滤您需要使用其他一些机制进行测试的数字集(例如,您的代码已经使用的试验部门)。

如果你真的想要所有数字低于你的候选人(而不仅仅是素数,更典型且效率更高)的试验分区,那么我建议{{1}你有每个线程在不同的基础上开始N的线程(3,5,7,...),每个线程candidate增加candidate所以它们都会触及一组唯一的数字(你现在从2开始并递增1,但我假设你最终会意识到偶数数字永远不会是素数......)

答案 1 :(得分:0)

您问题的直接答案是您传入了master_list整数的地址。这意味着所有线程都在相同的位置查找n是什么。因此,即使你锁定,增加,解锁,线程的行为也同样令人惊讶。尝试分配一个int数组,并让每个线程看一个单独的元素。这应该有望消除重复。

话虽如此,即使你做出了改变,也有很多可以改进的地方。有关大局的详细描述,请参阅本杰克逊的答案。