1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <pthread.h>
5 #include <unistd.h>
6 int message=10;
7 void printids(const char *str) {
8 pid_t pid = getpid();
9 pthread_t tid = pthread_self();
10 printf("%s pid: %u, tid: %u, tid in 0x presentation: 0x%x.\n",str, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
11 printf("%s, message is %d\n",str,message);
12 }
13
14 void *func(void *arg) {
15 pthread_detach(pthread_self());
16 sleep(2); // 等待主线程先退出
17 printids("descendant thread");
18 printf("fun is %d address is %p\n",*((int*)arg),arg);
19 return;
20 }
21
22 int main(void) {
23 int message_2=20;
24 pthread_t myid;
25 pthread_create(&myid, NULL, func,&message_2);
26 printf("message_2 address is %p\n",&message_2);
27
28 printids("main thread");
29 pthread_exit(NULL);
30
31 return 0; //进程退出,系统清除所有资源
32 }
imprimir
message_2 address is 0x7ffdda6a2e0c
main thread pid: 12009, tid: 4195251968, tid in 0x presentation: 0xfa0e7700.
main thread, message is 10
descendant thread pid: 12009, tid: 4186924800, tid in 0x presentation: 0xf98f6700.
descendant thread, message is 10
fun is 20 address is 0x7ffdda6a2e0c
Análisis:
1. Como variable local en la función principal, message_2 no se destruye después de que finaliza el hilo principal.
La dirección arg en el hilo myid es la misma que la dirección message_2 en el hilo principal.
2 El mensaje de variable global aún puede ser utilizado por el hilo myid después de que finaliza el hilo principal.
3 A lo largo de todo el proceso de ejecución, se puede ver que la unidad de suspensión es el hilo, y el final del hilo myid no afectará al hilo principal.
4 El espacio de datos multiproceso es compartido, por lo que las variables locales en la función principal no deben destruirse porque un subproceso finaliza.