这是我的代码:
#include <pthread.h>
#include <iostream>
using namespace std;
void* compute_prime (void* args)
{
int candidate = 2;
int n = *((int*)args);
while(1) {
int factor;
int is_prime = 1;
for (factor = 2; factor < candidate; ++factor)
if(candidate % factor == 0) {
is_prime = 0;
break;
}
if(is_prime){
if(--n == 0)
return (void*)candidate;
}
++candidate;
}
return NULL;
}
int main()
{
pthread_t thread;
int which_prime = 5000;
int prime;
pthread_create (&thread, NULL, &compute_prime, &which_prime);
pthread_join(thread, (void**)&prime);
printf("The %d th prime number is %d.\n", which_prime, prime);
};
输出为:
The 0 th prime number is 48611.
我的困惑是什么&#34;为什么which_prime
在主线程中成为0
&#34;。
我认为在功能void* compute_prime (void* args)
中,n
是which_prime
的副本,然后修改适用于n
,而不适用于which_prime
,那么什么& #39;是什么原因?
答案 0 :(得分:2)
此:
pthread_join(thread, (void**)&prime);
不正确并导致未定义的行为。 &prime
不是void**
,因为prime
不是void*
。请注意,void**
不 a&#34;通用指针指向&#34; - 它是void*
的正常指针。
相反,你应该这样做:
void *prime_result;
pthread_join(thread, &prime_result);
prime = (int)prime_result;
最有可能的是,void*
和int
在您的系统上的大小不同,因此尝试访问*(void**)&prime
会导致内存损坏。