GNU/Linux >> Znalost Linux >  >> Linux

Jak potvrdit, že je std::mutex uzamčen?

Přísně vzato, otázka se týkala kontroly uzamčení std::mutex přímo. Pokud je však povoleno zapouzdření do nové třídy, je to velmi snadné:

class mutex :
    public std::mutex
{
public:
#ifndef NDEBUG
    void lock()
    {
        std::mutex::lock();
        m_holder = std::this_thread::get_id(); 
    }
#endif // #ifndef NDEBUG

#ifndef NDEBUG
    void unlock()
    {
        m_holder = std::thread::id();
        std::mutex::unlock();
    }
#endif // #ifndef NDEBUG

#ifndef NDEBUG
    /**
    * @return true iff the mutex is locked by the caller of this method. */
    bool locked_by_caller() const
    {
        return m_holder == std::this_thread::get_id();
    }
#endif // #ifndef NDEBUG

private:
#ifndef NDEBUG
    std::atomic<std::thread::id> m_holder;
#endif // #ifndef NDEBUG
};

Všimněte si následujícího:

  1. V režimu uvolnění má nulovou režii nad std::mutex možná kromě konstrukce/destrukce (což u mutexových objektů není problém).
  2. m_holder člen je přístupný pouze mezi převzetím mutexu a jeho uvolněním. Samotný mutex tedy slouží jako mutex m_holder . S velmi slabými předpoklady o typu std::thread::id , locked_by_caller bude fungovat správně.
  3. Další komponenty STL, např. std::lock_guard jsou šablony, takže s touto novou třídou dobře fungují.

std::unique_lock<L>owns_lock členská funkce (ekvivalent is_locked jak říkáš).

std::mutex gmtx;
std::unique_lock<std::mutex> glock(gmtx, std::defer_lock);

void alpha(void) {
   std::lock_guard<decltype(glock)> g(glock);
   beta(void);
   // some other work
}
void beta(void) {
   assert(glock.owns_lock()); // or just assert(glock);
   // some real work
}

UPRAVIT: V tomto řešení by všechny operace uzamčení měly být prováděny pomocí unique_lock glock nikoli „raw“ mutex gmtx . Například alpha členská funkce je přepsána pomocí lock_guard<unique_lock<mutex>> (nebo jednoduše lock_guard<decltype(glock)> ).


Stačí použít recursive_mutex , které lze uzamknout vícekrát ve stejném vláknu. Poznámka:Pokud by to byl můj kód, restrukturalizoval bych ho tak, že nepotřebuji recursive_mutex , ale vyřeší to váš problém.


Linux
  1. Jak odblokovat IP v CSF

  2. Jak na to:Uzamčení z cPanelu a WHM přes cPHulk

  3. Jak používat příklady zámku C Mutex pro synchronizaci vláken v Linuxu

  1. pthreads mutex vs semafor

  2. Jak získat čas UTC

  3. Jak přesměrovat výstup programu jako jeho vstup

  1. Jak Hexdump funguje

  2. Jak odemknout soubor Rar uzamčený heslem, aniž byste znali heslo?

  3. Jak upgradovat Ubuntu 20.04 na Ubuntu 21.04