3

pthread_mutex_t事前にsを使っていました。コードが動かなくなることがありました。ラップした関数全体に数行のコードが散在していました...

pthread_mutex_lock(&map_mutex);// Line 1
  //critical code involving reading/writing wrapped around a mutex //Line 2
pthread_mutex_unlock(&map_mutex); //Line 3

コードがどこでどのようにスタックしていたかわからないので、に切り替えましpthread_mutex_tboost:mutex

1)1行目と3行目を1行目で置き換えるだけboost::lock_guard<boost::mutex> lock(map_mutex);で、すべてが問題なく機能する場合、pthreadの実装で何が問題になる可能性がありますか?

2)ブーストに切り替えてパフォーマンスをあきらめていますか?ここで重要な部分は非常に時間に敏感なので、ミューテックスを非常に軽量にしたいと思います。(C ++、redhat)

4

1 に答える 1

5
  1. 1行目と3行目の間で例外がスローされた場合、または関数が戻った場合、ミューテックスのロックは解除されません。次に誰かがそれをロックしようとすると、そのスレッドは無期限に待機します。

  2. Posixプラットフォームでboost::mutexは、は非常に薄いラッパーでありpthread_mutex_tlock_guardミューテックスへの参照が含まれているだけで、デストラクタでロックを解除します。唯一の余分なオーバーヘッドは、その参照を初期化すること(そしてそれでさえ最適化される可能性が高い)と、とにかく必要となる例外/リターンの場合にミューテックスのロックを解除するために必要な追加のコードです。

于 2012-08-21T13:19:11.053 に答える