29 Ocak 2018 Pazartesi

std::thread_local Storage Specifier

Giriş
std::thread_local sadece std::thread ile beraber kullanılabilir.

Tanımlama
Thread local değişkenler thread_local storage class specifier ile kullanılır.
thread_local int tls = 0;
var++;
Bu tanımlama farkı dışında aynı bir int gibi kullanılabilir.
tls += 37;
tls &= 11;
tls ^= 3;
extern bile yapılabilir.
// 3.cpp
extern thread_local int tls;    
...
...

// 4.cpp
thread_local int tls = 42;
Sınıf İçinde Tanımlama
thread_local global olmayan değişkenlerde kullanılamaz. Aşağıdaki kod derlenmez.
class Foo {
  public:
    int bar(Args args) {
      ...
      baz.xxx();
      
    }
  private:
    thread_local Baz baz;
};
C++11'den Önce
thread_local yerine gcc __thread tipini sunuyordu. __thread biraz daha hızlı çalışıyor. Açıklaması şöyle.
G++ now implements the C++11 thread_local keyword; this differs from the GNU __thread keyword primarily in that it allows dynamic initialization and destruction semantics. Unfortunately, this support requires a run-time penalty for references to non-function-local thread_local variables even if they don't need dynamic initialization, so users may want to continue to use __thread for TLS variables with static initialization semantics.
Ama tabi portable kod daha önemli.

Hiç yorum yok:

Yorum Gönder