所有互斥实现最终都会调用相同的基本系统/硬件调用 - 这意味着它们可以互换吗?
具体来说,如果我使用__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;
};
答案 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库函数来实现互斥是非常奇怪的。