Hilos y el espacio Addres -- multithreading campo con process campo con stack campo con memory-address camp Relacionados El problema

Threads and the addres space


-1
vote

problema

Español

Tengo los siguientes programas:

  char **ptr; /* global */  int main()  {   int i;   pthread_t tid;   char *msgs[N] = {   "Hello from foo",   "Hello from bar"   };   ptr = msgs;   for (i = 0; i < 2; i++)   Pthread_create(&tid,   NULL,   thread,   (void *)i);   Pthread_exit(NULL);    }  

  /* thread routine */  void *thread(void *vargp)  {   int myid = (int)vargp;   static int svar = myid;   f1 (myid, svar);   printf("[%d]: %s (svar=%d) ",   myid, ptr[myid], ++svar);  }  /* subroutine f1 */  void f1(id, id2)  {   If (id == id2){   something();   }else{   somethingelse();   }  }  

y tuve algunas preguntas sobre: ​​

1) ¿Dónde está el hilo () almacenado en el "espacio de direcciones"?

2) ¿Cuántas copias de la variable "MyID" tenemos y dónde están almacenado?

3) ¿Cuántas copias de la variable "svar" tenemos y donde se almacena?

4) Después del hilo 1, las llamadas F1 () qué subrutina (algo () o AlanEse ()) se llamará a continuación?

5) ¿Cuántas copias de PTR (definidas externas a Main ()) tenemos?

¡Cualquier ayuda sería muy apreciada! Gracias: -)

Original en ingles

I have the following programs :

char **ptr; /* global */  int main()  {   int i;   pthread_t tid;   char *msgs[N] = {   "Hello from foo",   "Hello from bar"   };   ptr = msgs;   for (i = 0; i < 2; i++)   Pthread_create(&tid,   NULL,   thread,   (void *)i);   Pthread_exit(NULL);    }

/* thread routine */  void *thread(void *vargp)  {   int myid = (int)vargp;   static int svar = myid;   f1 (myid, svar);   printf("[%d]: %s (svar=%d)\n",   myid, ptr[myid], ++svar);  }  /* subroutine f1 */  void f1(id, id2)  {   If (id == id2){   something();   }else{   somethingelse();   }  }

And I had a few questions about :

1) Where is thread() stored in the xe2x80x9caddress spacexe2x80x9d?

2) How many copies of the variable xe2x80x9cmyidxe2x80x9d do we have and where are they stored?

3) How many copies of the variable xe2x80x9csvarxe2x80x9d do we have and where is it stored?

4) After thread 1 calls f1() which subroutine (something() or somethingelse()) will be called next?

5) How many copies of ptr (defined external to main()) do we have?

Any help would be greatly appreciated! Thanks :-)

           

Lista de respuestas

0
 
vote

1) ¿Dónde está el hilo () almacenado en el "espacio de direcciones"?

Dondequiera que el compilador / enlazador / OS decida ponerlo. Normalmente, alguna forma de "segmento de código". Por lo general, hay uno por módulo, pero puede haber más, dependiendo de la configuración del compilador / enlazador / OS.

2) ¿Cuántas copias de la variable "MyID" tenemos y dónde están Ellos almacenaron?

2 copias. Crea 2 hilos, y cada uno tiene su propia copia de myid en su pila.

3) ¿Cuántas copias de la variable "svar" tenemos y donde se almacena?

Hay 1 copia de svar ; Es una variable static . Se almacenará en un segmento de datos global. Este puede ser el mismo segmento de datos que las variables declaradas en el ámbito global, o puede estar separado, dependiendo de la configuración del compilador / enlazador / OS.

4) después del hilo 1 Llamadas F1 () qué subrutina (algo () o AlanElse ()) & GT; será llamado siguiente?

El primer hilo para ejecutar la línea static int svar=myid establecerá svar ; El segundo subproceso se irá svar Sin modificar (Suponiendo que asume la estadística de C ++ 11 Style Safe-Safe --- En las versiones anteriores de MSVC, o GCC con estadísticas de Funda Safe desactivada, esta es una carrera de datos y comportamiento indefinido)

Esto puede ser del hilo 1 o el hilo 2. Cualquiera que sea el hilo "primero", luego llame a something , mientras que el otro hilo llamará somethingelse .

5) ¿Cuántas copias de PTR (definidas externas a Main ()) tenemos?

uno. Es una variable global.

 

1) Where is thread() stored in the xe2x80x9caddress spacexe2x80x9d?

Wherever the compiler/linker/OS decide to put it. Typically some form of "code segment". There is usually one per module, but there may be more, depending on the compiler/linker/OS configuration.

2) How many copies of the variable xe2x80x9cmyidxe2x80x9d do we have and where are they stored?

2 copies. You create 2 threads, and each has its own copy of myid on its stack.

3) How many copies of the variable xe2x80x9csvarxe2x80x9d do we have and where is it stored?

There is 1 copy of svar; it's a static variable. It will be stored in a global data segment. This may be the same data segment as variables declared at global scope, or it may be separate, depending on the compiler/linker/OS configuration.

4) After thread 1 calls f1() which subroutine (something() or somethingelse()) > will be called next?

The first thread to execute the static int svar=myid line will set svar; the second thread through will leave svar unchanged (assuming C++11-style thread-safe statics --- on older versions of MSVC, or gcc with thread-safe statics disabled this is a data race and undefined behaviour)

This may be thread 1 or thread 2. Whichever thread is "first" will then call something, while the other thread will call somethingelse.

5) How many copies of ptr (defined external to main()) do we have?

One. It is a global variable.

 
 
 
 

Relacionados problema

1  Dirección en una matriz dinámica de dos dimensiones en C ++  ( Address in dynamic two dimensional array in c ) 
Puedo crear una matriz bidimensional en C ++ de la siguiente manera. Pero tengo problemas para comprender la dirección de la memoria. (Tenga en cuenta la úl...

3  ¿Cómo leer de la dirección del puntero en Python?  ( How to read from pointer address in python ) 
Quiero leer en un script de Python una serie de bytes a partir de una dirección específica. E.G., quiero leer 40000 bytes a partir de 0x561124456. El punter...

2  C ++: Dirección a la cadena constante  ( C address to string constant ) 
¿Puedo obtener la dirección de un objeto como constante de cadena en G ++? Ejemplo: Private Shared Function ConvertToUTF8(ByVal html As String) As String ...

5  Gchandle para obtener la dirección (puntero) del objeto .NET  ( Gchandle to get addresspointer of net object ) 
Me las arreglé para obtener la dirección de un objeto .NET por GCHandle objHandle = GCHandle.Alloc(obj,GCHandleType.WeakTrackResurrection); int address = G...

4  El primer argumento de cadena a un flujo se guarda como un puntero / basura [duplicado]  ( The first string argument to a stringstream is saved as a pointer garbage ) 
Esta pregunta ya tiene respuestas aquí : Cerrado hace 8 años . posible duplicado: Impresió...

3  Cómo C ++ está calculando la dirección de desplazamiento cuando declaro la matriz de cuerdas  ( How c is calculating offset address when i declare array of strings ) 
Aunque la cadena es dinámica, por lo que no tendrá ningún tamaño definido, así que cuando obtenga s [1] antes de S [0] cómo C ++ calculará su dirección de com...

0  Dirección de 32 bits Confusión de ubicación ... (C Programación)  ( 32 bit address location confusion c programming ) 
en C, podemos colocar "& amp"; " antes de una variable para averiguar la dirección de esa variable. Tengo una máquina de 32 bits. Siempre que imprimo la direc...

4  ¿Accediendo una dirección de memoria desde una cadena en Go?  ( Accessing a memory address from a string in go ) 
en Golang, ¿puedo imprimir el valor de una dirección de memoria desde una cadena determinada? Por ejemplo, si ejecuta el siguiente código: a := "A String...

4  Dirección de (&) le da la dirección generada por el compilador o la dirección generada por el cargador?  ( Address of gives compiler generated address or loader generated address ) 
int a; printf("address is %u", &a); ¿Qué dirección es este ...? Me refiero a que es esta dirección generada por un compilador I.E. Dirección virtual o el...

-1  La declaración no puede resolver la dirección de la función sobrecargada QT / C ++  ( Statement cannot resolve address of overloaded function qt c ) 
void RollsRoyceTab::stateRRChanged(int) { stateRR = checkBoxRollsRoyce->checkState(); if(stateRR) emit signal_rr_alg; else emit signal_rr_manual; ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos