2017-08-05 47 views
0

我寫了一些關於boost共享互斥鎖的測試代碼。我剛剛發現有時boost :: shard_lock可能無法創建。Boost共享鎖失敗創建

我在這裏誤解了嗎?或者如何獲取日誌/異常?

const int thnum = 1000; 
const int times = 10000; 
long total = 0; 

boost::shared_mutex shared_mutex_lock; 

void shared_mutex_click() 
{ 
    for (int i = 0; i < times; ++i) 
    { 
     boost::shared_lock<boost::shared_mutex> readerLock(shared_mutex_lock); 
     ++total; 
    } 
} 

int main() 
{ 
    boost::thread_group threads; 
    clock_t start, end; 
    total = 0; 
    start = clock(); 
    for (int i = 0; i < thnum; ++i) 
    { 
     threads.create_thread(shared_mutex_click); 
    } 
    threads.join_all(); 
    end = clock(); 
    std::cout << "Shared Mutext Result: " << total << std::endl; 
    std::cout << "Shared Mutext Time: " << end - start << std::endl; 

    return 0; 
} 

當測試resule是: 共享Mutext結果:7102861 共享Mutext時間:2451

它應該是: 共享Mutext結果:千萬

權?爲什麼以及如何弄清楚發生了什麼,謝謝。

回答

2

線索在你的變量名 - 你有一個叫shared_lock您使用同步寫道:readerLock

從文檔here看來,您對shared_lock的理解是錯誤的。 A shared_lock旨在允許多個閱讀線程 - 但是您正在寫入狀態。您想要獨佔訪問才能寫入,這意味着shared_mutex上的unique_lock/lock_guard

編輯:另外值得指出的是,自C++ 11以來,核心C++庫有一些非常不錯的同步類,它們受Boost's的啓發。我發現它們的文檔更易於查找/閱讀,因此如果您開始學習並可以訪問C++ 11編譯器,則可能需要使用它們。

+0

哦,我明白了。你是對的。我應該使用boost :: unique_lock readerLock(shared_mutex_lock);寫。它按預期工作。並感謝您的意見BTW。 – QiangLiu

+0

@QiangLiu如果答案解決了您的問題,請考慮[將其標記爲答案](https://stackoverflow.com/help/someone-answers)。 – hnefatl