Может Реализации мьютексов должны меняться местами (независимо от реализации потока)

Все ли реализации мьютексов в конечном итоге вызывают одни и те же базовые системные / аппаратные вызовы - это означает, что их можно менять местами?

В частности, если я использую алгоритмы __ gnu_parallel (которые используют openmp ) и я хочу сделать классы, которые они вызывают, потокобезопасными, могу ли я использовать boost :: mutex для блокировки? или я должен написать свой собственный мьютекс, такой как описанный здесь

//An openmp mutex.  Can this be replaced with boost::mutex? 
class Mutex {  
public:
    Mutex() { omp_init_lock(&_mutex); }
    ~Mutex() { omp_destroy_lock(&_mutex); }
    void lock() { omp_set_lock(&_mutex); }
    void unlock() { omp_unset_lock(&_mutex); }
private:
    omp_lock_t _mutex;
};

Edit, ссылка выше на мьютекс openmp кажется неработающей, для всех, кому интересно, блокировка, которая идет с этим мьютексом, находится в этих lines

class Lock
{
public:
    Lock(Mutex& mutex) 
        : m_mutex(mutex), 
    m_release(false) 
    { 
        m_mutex.lock();
    }

    ~Lock() 
    {
        if (!m_release) 
            m_mutex.unlock(); 
    }

    bool operator() const 
    {
        return !m_release; 
    }

    void release()
    {
        if (!m_release)
        {
            m_release = true;
            m_mutex.unlock();
        }
    }

private:
    Mutex& m_mutex;
    bool m_release;
};

6
задан Alexis Wilke 6 May 2016 в 05:10
поделиться