10 Kasım 2016 Perşembe

std::atomic_bool Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <atomic>
C++'ta atomic bool olarak kullanılabilecek iki sınıf var. Bunlar std::atomic_bool ve std::atomic_flag

Constructor
Şöyle yaparız.
std::atomic<bool> consumerLock (false);
exchange metodu - spinlock için
Spinlock yerine kullanılabilir. Nesne false ile başlar. While döngüsüne ilk gelen değeri true atar, eski değer olan false while'dan çıkmamıza sebep olur. İşimiz bitinceye kadar diğer thread'ler true değer atasa bile eski değer de halan true olduğu için döngü beklerler. Biz işimizi bitirip false değerini atayınca arkadan gelen bir başka thread döngüye girebilir.
std::atomic<bool> consumerLock (false);

{  // the critical section
  while (consumerLock.exchange(true)) { } // this is the spinlock

  // do something useful

  consumerLock = false; // unlock
}
load ve store - spinlock için
Exchange metodu yerine şöyle yaparız.
std::atomic<bool> setup_ready(false);

{
  // thread 1
  while (!setup_ready.load()) std::this_thread::yield();

  // do something
}

{
  // thread 2
  // perform some setup
  setup_ready.store(true);
}
load ve store - flag için
Thread pool'da kapatma bayrağı için kullanılabilir. Şöyle bir değişken tanımlarız.
std::atomic<bool> shutdown_flag;
Değişkeni şöyle ilkendiririz.
shutdown_flag(false),
veya
shutdown_flag.store(false);
veya
shutdown_flag = false;
Daha sonra değişkeni şöyle kontrol ederiz.
while (!shutdown_flag.load())
{...}
operator = - flag için
load ve store ile aynıdır. Thread pool'da kapatma bayrağı için kullanılabilir.
Örnek
Şöyle bir değişken tanımlarız.
std::atomic<bool> isRunning;
Değişkeni şöyle ilklendiririz.
isRunning = false;
operator bool - flag için
Örnek
Değişkeni şöyle kontrol etmek için şöyle yaparız.
while(isRunning) {
{...}
Veya şöyle yaparız.
if(isRunning) {...}

Hiç yorum yok:

Yorum Gönder