3

我试图理解线程。我正在尝试让多个线程计算素数。我希望一个线程计算第一个数字,然后让下一个线程计算下一个数字,依此类推,然后无论哪个线程找到素数打印它。

因此,从 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.

ETC....

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

4

2 回答 2

1

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

我确信对并行素数计算的主题进行了认真的研究。在我的脑海中,我建议您依赖概率素数测试,您可以在许多数字上并行运行。这将极大地过滤您需要使用其他一些机制(例如试用除法,因为您的代码已经使用)测试的一组数字。

如果你真的想用比你的候选人低的所有数字进行试验划分(而不仅仅是素数,因为这将是更典型和更有效的),那么我建议N你让每个线程从candidate不同的基数开始(3、5 , 7, ...) 并且每个线程递增candidate2*N因此它们都达到了一组唯一的数字(您当前从 2 开始并递增 1,但我假设您最终会意识到偶数永远不是素数... )

于 2012-10-18T00:42:00.807 回答
0

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

话虽这么说,即使您进行了更改,也有很多可以改进的地方。请参阅 Ben Jackson 的回答,以获得对大局的良好描述。

于 2012-10-18T01:00:24.960 回答