Desde el errno Linux para ThreadLocal de Java


En la implementación de Linux de llamadas al sistema, por lo general tiene un valor de retorno indica el éxito o el fracaso, pero este valor sólo se ilustra el éxito o el fracaso, pero no explicó cómo el éxito o el fracaso.

errno es resolver este problema, el sistema llamará al número equivocado se establece en errno, seremos capaces de conocer la causa del fallo por el número de error. Strerror también se puede utilizar para imprimir las instrucciones de cuerda número de error. Las versiones antiguas de Linux necesidad de añadir extern int errno, ahora se introduce directamente en el <errno.h> en la línea.

ejemplo errno:

wKioL1WbuPjQ9_gzAAHrJFspGzI545.jpg

La pregunta vino. Si tengo dos hilos, el código es el siguiente:

wKiom1Wbt2CSHc8DAAC4FjSCW0c854.jpg

errno es una variable global, a continuación, si la orden de ejecución 1-1,2-1,1-2,2-2, enrosque 1 errno impresa es hilo 2, que es el problema errno, thread-safe.

Pero los tiempos de prueba muchos, los resultados son correctos. Aunque está usando esto como una variable global errno, pero en realidad es una macro. La expansión macro con el código fuente gcc -E se puede ver, una función se sustituye errno.

wKioL1WbuZuyhJVTAAJJJiKqJHo234.jpg

Uso hombre errno ver la interpretación de errno, se puede ver la siguiente frase:

       errno se define por la norma ISO C ser un lvalue modificable de
       tipo int, y no debe ser declarado explícitamente; errno puede ser un macro.
       errno es thread-local; colocarlo en un hilo no afecta a su
       valor en cualquier otro hilo.

Así errno no es una variable global, sino un local de subprocesos, cada hilo tiene una. Podemos lograr una propia errno.

 

Escriba su propia errno


Sólo demostrar los principios básicos de errno, errno la tienda utilizando un mapa de cada hilo, y este mapa es la clave ThreadID. Una vez finalizada la llamada al sistema, el código de error se escribirá en este hilo en el errno correspondiente. código de llamada del sistema es una llamada al sistema falso, some_system_call ().

El desarrollo actual, para los desarrolladores, que en realidad no puede ver set_errno (), get_errno () estas funciones, sólo tiene que tomar errno en la línea.

wKiom1Wbudzhz-3IAAUruAEgEOY812.jpg

 

Java 的 ThreadLocal


El errno ThreadLocal Java y Linux es el mismo, pero errno para los desarrolladores, más simplemente, y sólo puede tomar, como una variable en la línea.

wKioL1WbvwTCsMG7AAI8sT9dyJo690.jpg

sólo define un ThreadLocal, pero cada hilo es diferente.

realización propia de un ThreadLocal


De hecho, ThreadLocal también errno y me di cuenta similar a la anterior, con un mapa, interesados ​​pueden echar un vistazo fuente de JDK, escribí una muy simple MyThreadLocal, principios ThreadLocal de Java en general, es el caso. ThreadLocal directamente por encima de código puede ser reemplazado plazo MyThreadLocal, por supuesto, esto MyThreadLocal demasiado sencillo, basta con introducir el principio.

wKioL1WbwHKxdsl-AAJ3jZYOBEA724.jpg

 

 

https://www.jianshu.com/p/cdaf9b91fd21

https://www.jianshu.com/p/38a85d1851bb

https://www.jianshu.com/p/07ce7190a097

Supongo que te gusta

Origin www.cnblogs.com/awzh2020/p/12615464.html
Recomendado
Clasificación