我正在尝试理解线程。我试图让多个线程计算素数。我想要一个线程来计算第一个数字,然后让下一个线程计算下一个数字,然后等到那个线程找到主要打印它。
所以,从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.
等...
这有点像我想要的。但并非每个线程都应该找到相同的素数。他们应该找到不同的素数。即使我在线程之前增加变量它仍然无法工作。我评论了我试图让它工作的代码。我需要做什么?我希望我很清楚。
答案 0 :(得分:1)
枚举素数不是令人难以置信的并行,这意味着将问题分解为独立计算并非易事。筛分和试验部门需要(或至少大大改善)以前的素数历史。
我确信有关于并行素数计算主题的认真研究。我不建议你依靠probabilistic prime test,你可以在很多数字上并行运行。这将极大地过滤您需要使用其他一些机制进行测试的数字集(例如,您的代码已经使用的试验部门)。
如果你真的想要所有数字低于你的候选人(而不仅仅是素数,更典型且效率更高)的试验分区,那么我建议{{1}你有每个线程在不同的基础上开始N
的线程(3,5,7,...),每个线程candidate
增加candidate
所以它们都会触及一组唯一的数字(你现在从2开始并递增1,但我假设你最终会意识到偶数数字永远不会是素数......)
答案 1 :(得分:0)
您问题的直接答案是您传入了master_list整数的地址。这意味着所有线程都在相同的位置查找n是什么。因此,即使你锁定,增加,解锁,线程的行为也同样令人惊讶。尝试分配一个int数组,并让每个线程看一个单独的元素。这应该有望消除重复。
话虽如此,即使你做出了改变,也有很多可以改进的地方。有关大局的详细描述,请参阅本杰克逊的答案。