Все ли реализации мьютекса в конечном итоге вызывают одинаковые базовые системные / аппаратные вызовы - это означает, что они могут быть взаимозаменяемы?
В частности, если я использую __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;
};
Edit, ссылка выше на мьютекс 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;
};