Tom*_*Tom 6 c++ mutex openmp boost-thread
所有互斥实现最终都会调用相同的基本系统/硬件调用 - 这意味着它们可以互换吗?
具体来说,如果我正在使用__gnu_parallel
算法(使用openmp
)并且我想创建它们调用线程安全的类可以boost::mutex
用于锁定吗?或者我必须编写自己的互斥锁,例如此处描述的互斥锁
//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;
};
Run Code Online (Sandbox Code Playgroud)
编辑,上面的openmp mutex链接似乎被打破了,对于任何感兴趣的人来说,与这个互斥锁一起使用的锁是沿着这些线
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;
};
Run Code Online (Sandbox Code Playgroud)
您不应该混合同步机制。例如,当前的 pthreads 互斥体实现基于 futex,它与以前的 pthreads 实现不同(请参阅 参考资料man 7 pthreads
)。如果您创建自己的抽象级别,则应该使用它。应该考虑你的需求是什么——线程间同步还是进程间同步?如果您需要与使用 boost::mutex 的代码合作,您应该使用 boost::mutex 代替 open mp。另外恕我直言,使用 open mp 库函数来实现互斥是很奇怪的。