The errno in Linux
When executing system calls under Linux, a return value typically indicates success or failure, but this value only indicates success or failure, but does not indicate how successful or failed.
Errno is to solve this problem, the system call will set the error number to errno, we can use the error number to know the reason for the failure. You can also use Strerror to print out the string description for this error number. The old version of Linux needs to add the extern int errno, which is now directly introduced into <errno.h>.
errno Example:
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M01/6F/6A/wKioL1WbuPjQ9_gzAAHrJFspGzI545.jpg "title=" Selection _ 002.png "alt=" Wkiol1wbupjq9_gzaahrjfspgzi545.jpg "/>
Now the question is coming. If I have two threads, the code is as follows:
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M01/6F/6D/wKiom1Wbt2CSHc8DAAC4FjSCW0c854.jpg "title=" Selection _ 011.png "alt=" Wkiom1wbt2cshc8daac4fjscw0c854.jpg "/>
errno is a global variable, then if the execution order is 1-1,2-1,1-2,2-2, thread 1 prints out the errno is thread 2, this is errno problem, thread is unsafe.
But the tests were many times and the results were correct. Although you use this errno as a global variable, it is actually a macro. Using GCC-E to expand the source code macro, you can see that errno is replaced with a function.
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M02/6F/6A/wKioL1WbuZuyhJVTAAJJJiKqJHo234.jpg "title=" Selection _ 003.png "alt=" Wkiol1wbuzuyhjvtaajjjikqjho234.jpg "/>
Using man errno to view the explanation of errno, you can see the following sentence:
errno is defined by the ISO C standard to be a modifiable lvalue of
type int, and must not being explicitly declared; errno may be a macro.
Errno is thread-local; Setting it in one thread does not affect it
value in any other thread.
So errno is not a global variable, but a thread-local, each thread has one. We can implement a errno ourselves.
Write yourself a errno
Just demonstrate the fundamentals of errno and use a map to store the errno of each thread, and this map key is ThreadID. When the system call finishes executing, the error code is written to the corresponding errno of this thread. The system call in the code is a fake system call, Some_system_call ().
In the actual development, for the developer, he actually does not see Set_errno (), Get_errno () These functions, he only need to take errno on the line.
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M01/6F/6D/wKiom1Wbudzhz-3IAAUruAEgEOY812.jpg "title=" Selection _ 007.png "alt=" Wkiom1wbudzhz-3iaauruaegeoy812.jpg "/>
Java's threadlocal
Java's threadlocal and Linux errno are the same, but errno is a bit simpler for developers, and can only be taken as a variable.
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M00/6F/6A/wKioL1WbvwTCsMG7AAI8sT9dyJo690.jpg "title=" Selection _ 013.png "alt=" Wkiol1wbvwtcsmg7aai8st9dyjo690.jpg "/>
Only one threadlocal is defined, but each line thread is different.
Implement a threadlocal yourself
In fact, Threadlocal also and above my own implementation of the errno similar, with a map, interested can go to see the JDK source code, I wrote a very simple mythreadlocal,java threadlocal principle is roughly the case. The threadlocal of the above code can be replaced directly by Mythreadlocal to run, of course, this mythreadlocal is too simple, just to introduce the principle.
650) this.width=650; "src=" Http://s3.51cto.com/wyfs02/M01/6F/6A/wKioL1WbwHKxdsl-AAJ3jZYOBEA724.jpg "title=" Selection _ 009.png "alt=" Wkiol1wbwhkxdsl-aaj3jzyobea724.jpg "/>
This article from "Niu Blog" blog, reproduced please contact the author!
From Linux errno to Java threadlocal