' pthread '的运行函数如何修改外部变量

How the run function of `pthread` modify the external variable?

本文关键字:修改 外部 变量 pthread 运行 函数 何修改      更新时间:2023-10-16

下面是我的代码:

#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.

我的困惑是"为什么which_prime在主线程中变成0"。

我认为在函数void* compute_prime (void* args)中,nwhich_prime的副本,那么修改是针对n的,而不是针对which_prime的,那么原因是什么?

This:

pthread_join(thread, (void**)&prime);

是不正确的,会导致未定义的行为。&prime不是void**,因为prime不是void*。注意,void**而不是一个"泛型指针指向指针"——它是一个普通指针,指向void*

你应该这样做:

void *prime_result;
pthread_join(thread, &prime_result);
prime = (int)prime_result;

最有可能的是,void*int在您的系统上是不同的大小,所以试图访问*(void**)&prime会导致内存损坏。