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

时间:2011-05-15 10:07:45

标签: c++ mutex openmp boost-thread

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

具体来说,如果我使用__gnu_parallel算法(使用openmp)并且我想创建他们称为线程安全的类,我可以使用boost::mutex进行锁定吗?或者我必须编写自己的互斥锁,例如here

所描述的互斥锁
//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;
};

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

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;
};

3 个答案:

答案 0 :(得分:3)

此链接提供了有用的讨论:

http://groups.google.com/group/comp.programming.threads/browse_thread/thread/67e7b9b9d6a4b7df?pli=1

释义,(至少在Linux上)Boost :: Thread和OpenMP都是pthread的接口,因此原则上应该能够混合(如Anders所说的那样),但以这种方式混合线程技术通常是坏主意(正如安迪所说,+1)。

答案 1 :(得分:2)

需要兼容性的部分是线程挂起,重新调度和上下文切换。只要线程是由操作系统调度的真实线程,您就应该能够使用任何依赖于某种kerner原语的互斥实现来暂停和恢复等待的线程。

答案 2 :(得分:2)

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