2014-10-10 52 views
-1

我有了經常讀一些數據的多線程應用程序,偶爾的數據將被更新。我用upgrade_lock 有有書寫困難,通過使用unique_lock和問題閱讀我的問題的例子:升壓shared_mutex析構函數

void unlock(){ 
    test.stream = 0; 
    test.mtx.unlock(); 
} 

void lock_mtx(int i){ 
    boost::unique_lock<boost::shared_mutex> lock(test.mtx); 
    test.stream = i; 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(10000)); 
    unlock(); 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); 
} 

當我破壞lock,互斥鎖已經由該線程解鎖,有時它被另一個鎖定線程,但析構函數使它再次釋放。鎖的破壞(在第一線程)第三挑線互斥和後我在一個時刻兩位作家

void lock_mtx(int i){ 
    boost::upgrade_lock<boost::shared_mutex> lock(test.mtx); 
    read_from_locked(); 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(5000)); 
    boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock); 
    write_to_locked(); 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(10000)); 
} 

的第二個問題是,當一些線程需要upgrade_lock,其他線程無法讀取的共享對象

的問題都發生在MS的VisualStudio 2013和Windows8的64

回答

1
void lock_mtx(int i) 
{ 
    { 
     boost::unique_lock<boost::shared_mutex> lock(test.mtx); 
     test.stream = i; 
     boost::this_thread::sleep_for(boost::chrono::milliseconds(10000)); 
    } 
    boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); 
} 

unique_locklock_guard目的是當它超出範圍自動解鎖互斥。這種模式被稱爲RAII。

經驗法則:切勿在您的(基本|共享)可鎖定對象上手動撥打lock()/unlock()。這是一個反模式,因爲

  • 這是非常難以得到正確的(想想異常安全的)
  • 它通常表示一個代碼味道(鎖被關押在不同的方法調用)。如果你甚至需要這個,可以考慮讓RAII lock guard(lock_guardunique_lock)成爲包含類的成員,或者返回unique_lock以便呼叫者可以選擇明確地adopt這個鎖,或者讓它自動釋放由警衛。