noisiv 1
noisiv
Manwe Work 1
Manwe Work
Scarlet 1
Scarlet
Bvural41 1
Bvural41
mavzermete 1
mavzermete
Hikaye Ekle

Altın Konu C++ Recursive Mutex Kullanımı

  • Konuyu başlatan Konuyu başlatan Shorty
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 12
  • Görüntüleme Görüntüleme 2K

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Selamlar

Projelerinizde kullanabileceğiniz Recursive Mutex Sınıfı:
C++:
#pragma once
#include <mutex>

class Guard
{
public:
    Guard(std::recursive_mutex& mutex) : target(mutex) { target.lock(); }
    Guard(std::recursive_mutex* mutex) : target(*mutex) { target.lock(); }
    ~Guard() { target.unlock(); }

protected:
    std::recursive_mutex& target;
};

Kullanımı:
C++:
std::recursive_mutex m_vecLootListLock; // Global
Guard lock(m_vecLootListLock);

Neden buna ihtiyaç duyuyoruz?

Threadler arasında bazen senkronizasyon ihtiyacı oluyor, Örneğin bir vectorumuz var ve A Threadi içerisinde çalışıyor ayrıca bu Thread vectore veri giriş/çıkışı yapıyor, B Threadi ise A Threadi içerisinde veri girişi yapılan Vector üzerinde okuma ve sonuca göre işlem yapıyor bu threadler farklı iş parçacıkları içerisinde olmasından dolayı okuma yaptığımız sırada vectore bir veri girişi olması halinde B Threadi içerisinde heap memory corruption ile karşılaşıyoruz bu kritik bir hata olduğu için uygulamanın çakılmasına neden oluyor. Bu nedenle farklı threadler arasında ortaklaşa gerçekleştirilen işlemlerden önce mutex ile işlemleri senkronize halde tutmamız gerekiyor

Ayrıca bu sınıfın şöyle tatlı bir olayı var dikkat ettiyseniz yıkıcısında "target.unlock();" çalışıyor dolayısıyla fonksiyon içerisinde iş bittiğinde Guard kilidi kaldırıyor.
 

En Çok Reaksiyon Alan Mesajlar

"std::recursive_mutex m_vecLootListLock; // Global"

Bu değişkeni global olarak kullanırsanız ve unlock edilmeden birden fazla lock edilmeye çalışıldığında muhtemel bir deadlock'a sebep olacaktır. Kolaylık sağlaması için zaten kitli mi diye kontrol eden bir değişken kullanıldıktan sonra kitlemeye geçilebilir.
Selamlar

Projelerinizde kullanabileceğiniz Recursive Mutex Sınıfı:
C++:
#pragma once
#include <mutex>

class Guard
{
public:
    Guard(std::recursive_mutex& mutex) : target(mutex) { target.lock(); }
    Guard(std::recursive_mutex* mutex) : target(*mutex) { target.lock(); }
    ~Guard() { target.unlock(); }

protected:
    std::recursive_mutex& target;
};

Kullanımı:
C++:
std::recursive_mutex m_vecLootListLock; // Global
Guard lock(m_vecLootListLock);

Neden buna ihtiyaç duyuyoruz?

Threadler arasında bazen senkronizasyon ihtiyacı oluyor, Örneğin bir vectorumuz var ve A Threadi içerisinde çalışıyor ayrıca bu Thread vectore veri giriş/çıkışı yapıyor, B Threadi ise A Threadi içerisinde veri girişi yapılan Vector üzerinde okuma ve sonuca göre işlem yapıyor bu threadler farklı iş parçacıkları içerisinde olmasından dolayı okuma yaptığımız sırada vectore bir veri girişi olması halinde B Threadi içerisinde heap memory corruption ile karşılaşıyoruz bu kritik bir hata olduğu için uygulamanın çakılmasına neden oluyor. Bu nedenle farklı threadler arasında ortaklaşa gerçekleştirilen işlemlerden önce mutex ile işlemleri senkronize halde tutmamız gerekiyor

Ayrıca bu sınıfın şöyle tatlı bir olayı var dikkat ettiyseniz yıkıcısında "target.unlock();" çalışıyor dolayısıyla fonksiyon içerisinde iş bittiğinde Guard kilidi kaldırıyor.
Paylaşım için teşekkürler.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst