是否所有互斥量实现最终都调用相同的基本系统/硬件调用 - 这意味着它们可以互换?
具体来说,如果我正在使用 __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/