`pthread`的run函数如何修改外部变量?

时间:2016-06-29 08:11:41

标签: c++ c multithreading

这是我的代码:

#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)中,nwhich_prime的副本,然后修改适用于n,而不适用于which_prime,那么什么& #39;是什么原因?

1 个答案:

答案 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会导致内存损坏。