可以互换互斥实现(独立于线程实现)

Tom*_*Tom 6 c++ mutex openmp boost-thread

所有互斥实现最终都会调用相同的基本系统/硬件调用 - 这意味着它们可以互换吗?

具体来说,如果我正在使用__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;
};
Run Code Online (Sandbox Code Playgroud)

编辑,上面的openmp mutex链接似乎被打破了,对于任何感兴趣的人来说,与这个互斥锁一起使用的锁是沿着这些线

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;
};
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 2

您不应该混合同步机制。例如,当前的 pthreads 互斥体实现基于 futex,它与以前的 pthreads 实现不同(请参阅 参考资料man 7 pthreads)。如果您创建自己的抽象级别,则应该使用它。应该考虑你的需求是什么——线程间同步还是进程间同步?如果您需要与使用 boost::mutex 的代码合作,您应该使用 boost::mutex 代替 open mp。另外恕我直言,使用 open mp 库函数来实现互斥是很奇怪的。