2011-05-15 58 views
6

所有互斥體實現最終是否會調用相同的基本系統/硬件調用 - 這意味着它們可以互換?互斥體實現是否可以互換(獨立於線程實現)

具體來說,如果我使用的是__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

另請參閱我的答案在這裏: http://stackoverflow.com/questions/15367988/is-it-safe-to-mix-pthread-h-and-c11-standard-library-threading-features/37065051# 37065051只要您每次訪問某組數據時都使用該方法,您就可以使用任何方法。 – 2016-05-07 20:53:59

回答

2

您不應混用同步機制。例如。當前pthreads互斥體實現基於futex,並且與以前的pthreads實現不同(請參見man 7 pthreads)。如果你創建你自己的抽象層次,你應該使用它。應該考慮你需要什麼 - 線程間或進程間同步? 如果您需要與使用boost :: mutex的代碼進行合作,您應該使用boost :: mutex來代替打開的mp。 另外恕我直言,它是很奇怪的使用打開mp庫函數來實現互斥。

+1

「_您不應該混用同步機制。」爲什麼不? – curiousguy 2011-10-24 05:50:33

2

需要兼容性的部分是線程暫停,重新計劃和上下文切換。只要線程是由操作系統調度的真實線程,就應該能夠使用任何依賴某種克爾原語來掛起和恢復等待線程的互斥體實現。

+0

除非它們還依賴於線程ID或某些線程本地數據,這些數據是Boost特定的,等等。 – curiousguy 2011-10-24 05:51:57