Могут ли взаимные реализации взаимозаменяться (независимо от реализации потока) - PullRequest
6 голосов
/ 15 мая 2011

Все ли реализации мьютекса в конечном итоге вызывают одинаковые базовые системные / аппаратные вызовы - это означает, что они могут быть взаимозаменяемы?

В частности, если я использую __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;
};

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Эта ссылка дает полезное обсуждение:

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

Перефразируя, (по крайней мере, в Linux) Boost :: Thread и OpenMP и интерфейс к pthread, и поэтому в принципе должен бытьможно смешивать (как Андерс говорит +1), но смешивать технологии потоков таким образом, как правило, плохая идея (как Энди говорит, +1).

2 голосов
/ 15 мая 2011

Вы не должны смешивать механизмы синхронизации. Например. Текущая реализация мьютекса pthreads основана на futex и отличается от предыдущих реализаций pthreads (см. man 7 pthreads). Если вы создаете свой собственный уровень абстракции, вы должны его использовать. Следует учитывать, что вам нужно - межпотоковая или межпроцессная синхронизация? Если вам нужно сотрудничество с кодом, который использует boost :: mutex, вы должны использовать boost :: mutex вместо open mp. Кроме того, имхо, довольно странно использовать функции библиотеки open mp для реализации мьютекса.

2 голосов
/ 15 мая 2011

Часть, требующая совместимости, - это приостановка потока, перепланирование и переключение контекста.Пока потоки являются реальными потоками, запланированными операционной системой, вы должны иметь возможность использовать любую мьютексную реализацию, которая использует некоторый примитив кернера для приостановки и возобновления ожидающего потока.

...