c++ - 互斥实现可以互换吗(独立于线程实现)

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

最佳答案

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

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

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

关于c++ - 互斥实现可以互换吗(独立于线程实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007731/

相关文章:

c++ - std::sort 对于少量数据来说很慢

c++ - 在 C++ 中选择两个纯虚函数之一

c - 使用全信号量程序代替互斥体和 cond_t

c++ - OpenMP:从上到下的文本

c - 什么时候需要减少?

c - OpenMP线程,如何正确使用omp原子子句?

c++ - 指针互转换:派生到base的reinterpret_cast

c# - 我们如何在 C# 中从 C++ DLL 获取所有方法?

c - 是否可以确定持有互斥体的线程?

c - 如何通过在本地使用互斥变量来锁定线程?