13 Ekim 2017 Cuma

std::shared_mutex Sınıfı

Giriş
C++17 ile geliyor. Bu sınıf'ta upgrade lock denilen bir kavram mevcut değil.

Read lock almak için şöyle yaparız.
std::shared_lock<std::shared_mutex> rl (mySharedMutex); // lock shared
Write lock almak için şöyle yaparız.
std::unique_lock<std::shared_mutex> wl (mySharedMutex);
Örnek
Şöyle yaparız.
// Multiple threads/readers can read the counter's value at the same time.
unsigned int get() const {
  std::shared_lock<std::shared_mutex> lock(mutex_);
  return value_;
}

// Only one thread/writer can increment/write the counter's value.
void increment() {
  std::unique_lock<std::shared_mutex> lock(mutex_);
  value_++;
}
Örnek
Elimizde read ve write için double buffer kullanan bir yapı olsun.
cv::Mat currentFrame[2];
std::shared_mutex frameMutex[2];
std::mutex writeMutex;
std::atomic<int> activeFrame = 0;
Writer şöyle için yaparız.
std::unique_lock<std::mutex> writeLock(writeMutex);
const int writeFrame = activeFrame ^ 1;
std::unique_lock<std::shared_mutex> frameLock(frameMutex[writeFrame]);
cv_img.copyTo(currentFrame[writeFrame]);
activeFrame = writeFrame;
Reader için şöyle yaparız.
const int readFrame = activeFrame;
std::shared_lock<std::shared_mutex> frameLock(frameMutex[readFrame]); // lock shared
currentFrame[readFrame].copyTo(frame);

Hiç yorum yok:

Yorum Gönder