2016-09-22 14 views
0

以下のメンバ関数を考えてみましょう。デッドロックにつながるでしょうか?2つのオーバーラップするmutexによってデッドロックが発生しますか?

void foo::insert(item_ptr item) 
{ 
    lock_guard<mutex> lock(mu_); 
    items_.insert(item); 
} 

void foo::insert(vector<item_ptr> items) 
{ 
     lock_guard<mutex> lock(mu_); // will this lead 
                 // to deadlock? 
     for(auto item:items) 
      insert(item); 
} 
+0

詳細情報を追加してください。 'foo:insert'は構文エラーです。 2つのスレッドの中でどちらが呼び出されているのか... – Rakete1111

+0

お互いに依存しない限り、私はそうは思わないでしょう。あなたは私たちにフルクラスを教えてもらえますか? – refi64

+1

ミューテックスは、C++ライブラリの実装に準拠していません。あ、はい。代わりにrecursive_mutexを使用してください。 –

答えて

1

mu_std::mutexある場合は、問題を抱えています。 std :: mutexは再帰的ロックをサポートしておらず、同じスレッドによって2回ロックすることはできません。参照:http://en.cppreference.com/w/cpp/thread/mutex

IF mu_std::recursive_mutexの場合、問題はありません。ロックされているスレッドは、再帰的なミューテックスをロックすることができます。 http://en.cppreference.com/w/cpp/thread/recursive_mutex

関連する問題