2 Kasım 2018 Cuma

std::atomic_load

Giriş
Bu metod ile std::atomic<T> tipinin değerini alırız. Açıklaması şöyle
The reason why we have these free function templates at all is source compatibility with C11:
C++ ile kodlarken bu metoda ihtiyacımız yok. std::atomic sınıfı zaten bu işlevi sağlıyor.

İmzası
İmzası şöyle.
template<class T>
T atomic_load(const std::atomic<T> *obj) noexcept;
Örnek
Şöyle yaparız
#ifdef __cplusplus
  #include <atomic>
  #define _Atomic(X) std::atomic<X>
#else
  #include <stdatomic.h>
#endif

_Atomic(int) c;

int get_c(void) { 
  return atomic_load(&c); 
}
Örnek - std:.shared_ptr
std::atomic_load std::shared_ptr için özelleşmiş durumda. thread a çalışırken thread b yeni bir nesne yaratır ve double buffering ile nesneyi değiştirir. Şöyle yaparız.
std::shared_ptr<Object> object;

void thread_a()
{
  std::atomic_load(&object)->doSomething(); // (1)
}

void thread_b()
{
    std::shared_ptr<Object> oldObject = std::atomic_load(&object);
    std::shared_ptr<Object> newObject = std::make_shared<Object>();
    // Update new object accordingly...

    while (!std::atomic_compare_exchange_weak(object, oldObject, newObject));
}

Hiç yorum yok:

Yorum Gönder