我从高级Linux编程书中获得了此代码。当我尝试在Linux 64位环境下执行代码时,函数调用后which_prime
变量的值被破坏(更改为0)。pthread_join损坏堆栈中的pthread_create参数
在这个例子中为什么which_prime
值运行在pthread_join后,被破坏?
一般我们可以使用传递给pthread_create的安全函数内部主即使我们所说的其他功能,如pthread_join()
的第四个参数?
#include <pthread.h>
#include <stdio.h>
/* Compute successive prime numbers (very inefficiently). Return the
Nth prime number, where N is the value pointed to by *ARG. */
void* compute_prime (void* arg)
{
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()
{
pthread_t thread;
int which_prime = 5000;
int prime;
/* Start the computing thread, up to the 5,000th prime number. */
pthread_create (&thread, NULL, &compute_prime, &which_prime);
/* Do some other work here... */
/* Wait for the prime number thread to complete, and get the result. */
pthread_join (thread, (void*) &prime);
/* Print the largest prime it computed. */
printf(“The %dth prime number is %d.\n”, which_prime, prime);
return 0;
}
这里有一个提示:原型为'pthread_join'是'INT在pthread_join(的pthread_t线程,无效** RETVAL);' - 在那第二个参数密切关注。 – 2015-02-18 03:56:16