2017-08-05 72 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