【问题标题】:Can mutex implementations be interchanged (independently of the thread implementation)互斥体实现是否可以互换(独立于线程实现)
【发布时间】:2011-08-25 20:23:56
【问题描述】:

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

具体来说,如果我使用__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;
};

【问题讨论】:

标签: c++ mutex openmp boost-thread


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • "你不应该混合同步机制。" 为什么不呢?
    【解决方案3】:

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

    【讨论】:

    • 除非它们还依赖于线程 ID 或某些特定于 Boost 的线程本地数据等。
    猜你喜欢
    • 2013-10-08
    • 2014-10-03
    • 2013-02-11
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多