2017-08-05 19 views
0

私はブースト共有ミューテックスについていくつかのテストコードを書いています。私は時々boost :: shard_lockが作成に失敗したことに気付きました。ブースト共有ロックの作成に失敗しました

私はここで誤解しましたか?またはログ/例外を取得する方法は?

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結果:10000000

右?なぜ、何が起こったのか把握する方法、ありがとう。

答えて

2

手掛かりは、あなたの変数名であります - あなたはを書き込み同期するために使用readerLockと呼ばれるshared_lockを持っています。

文書から、shared_lockの理解が間違っているようです。 shared_lockは、複数の読み込みスレッドを可能にするように設計されていますが、代わりにその状態に書き込んでいます。書き込み専用のアクセス権が必要な場合は、shared_mutexunique_lock/lock_guardを意味します。

編集:C++ 11以来、コアC++ライブラリには、Boostのインスピレーションを得たかなり良い同期クラスがあります。私はそれらのドキュメントを見つけやすく、読んでいるので、学習を始めてC++ 11コンパイラにアクセスする場合は、代わりにそれらを使う価値があります。

+0

わかりました。あなたは正しいです。私はboost :: unique_lock readerLock(shared_mutex_lock)を使うべきです。書き込みのために。期待どおりに動作します。そしてあなたの助言BTWに感謝します。 – QiangLiu

+0

@QiangLiu答えがあなたの問題を解決した場合は、[回答としてマークする](https://stackoverflow.com/help/someone-answers)を検討してください。 – hnefatl

関連する問題