如何使用pthread修改主进程中的指针?

How to use pthread to modify pointers in main process?

在下面的示例中,我尝试使用pthread 修改主进程中的char 指针。但是,我没有看到指针值发生变化。是什么原因,我该如何实现我的目标?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h>  //Header file for sleep(). man 3 sleep for details. 
#include <pthread.h> 
#include <errno.h> 
#include <string.h> 

char *target = "thread";

void *modify(void *vargp) { 
  vargp = target;
  printf("Thread vargp = %s\n", (char*)vargp);
  return NULL; 
} 
   
int main() {
  char *pt = "main";
  pthread_t thread_id; 
  printf("Before Thread, pt = %s\n", pt); 
  pthread_create(&thread_id, NULL, modify, pt); 
  pthread_join(thread_id, NULL); 
  printf("After Thread, pt = %s\n", pt); 
  
  exit(0); 
}


$ ./pthread_simple 
Before Thread, pt = main
Thread vargp = thread
After Thread, pt = main

我要实现的是:

$ ./pthread_simple 
Before Thread, pt = main
Thread vargp = thread
After Thread, pt = thread

函数参数是所传递内容的副本,对它们的更改是函数局部的。要让函数修改内容,您必须将 指针传递给 应该修改的内容。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h>  //Header file for sleep(). man 3 sleep for details. 
#include <pthread.h> 
#include <errno.h> 
#include <string.h> 

char *target = "thread";

void *modify(void *vargp) { 
  *(char**)vargp = target; /* add cast and dereference to modify what is pointed */
  printf("Thread vargp = %s\n", *(char**)vargp); /* add cast and dereference */
  return NULL; 
} 
   
int main() {
  char *pt = "main";
  pthread_t thread_id; 
  printf("Before Thread, pt = %s\n", pt); 
  pthread_create(&thread_id, NULL, modify, &pt); /* pass pointer to pt */
  pthread_join(thread_id, NULL); 
  printf("After Thread, pt = %s\n", pt); 
  
  exit(0); 
}