Is there a difference between these two code segments:
void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
and
void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
Backstory: originally I had a STATIC vector V (for holding some intermediate values, it gets cleared every time I enter the function) and a single-threaded program. I want to turn the program into a multithreading one, so somehow I have to get rid of this static modifier. My idea is to turn every static into thread_local and not worry about anything else? Can this approach backfire?
A local static variable is a variable, whose lifetime doesn't stop with a function call where it is declared. It extends until the lifetime of a complete program. All function calls share the same copy of local static variables. These variables are used to count the number of times a function is called.
Static variables can be assigned as many times as you wish.
When static keyword is used, variable or data members or functions can not be modified again. It is allocated for the lifetime of program. Static functions can be called directly by using class name. Static variables are initialized only once.
A static variable is a variable that is declared using the keyword static. The space for the static variable is allocated only one time and this is used for the entirety of the program. Once this variable is declared, it exists till the program executes.
According to the C++ Standard
When thread_local is applied to a variable of block scope the storage-class-specifier static is implied if it does not appear explicitly
So it means that this definition
void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
is equivalent to
void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
However, a static variable is not the same as a thread_local variable.
1 All variables declared with the thread_local keyword have thread storage duration. The storage for these entities shall last for the duration of the thread in which they are created. There is a distinct object or reference per thread, and use of the declared name refers to the entity associated with the current thread
To distinguish these variables the standard introduces a new term thread storage duration along with static storage duration.
Yes, "thread-local storage" is very similar to "global" (or "static storage"), only that instead of "duration of the entire program" you have "duration of the entire thread". So a block-local thread-local variable is initialized the first time control passes through its declaration, but separately within each thread, and it's destroyed when the thread ends.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With